惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

宝玉的分享
宝玉的分享
Recent Commits to openclaw:main
Recent Commits to openclaw:main
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
T
Tailwind CSS Blog
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
罗磊的独立博客
V
Visual Studio Blog
爱范儿
爱范儿
H
Help Net Security
J
Java Code Geeks
I
InfoQ
Recent Announcements
Recent Announcements
H
Hackread – Cybersecurity News, Data Breaches, AI and More
Recorded Future
Recorded Future
Jina AI
Jina AI
Microsoft Security Blog
Microsoft Security Blog
WordPress大学
WordPress大学
GbyAI
GbyAI
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
Y
Y Combinator Blog
Google DeepMind News
Google DeepMind News
Scott Helme
Scott Helme
S
SegmentFault 最新的问题
S
Securelist
L
LINUX DO - 热门话题
Cyberwarzone
Cyberwarzone
C
Cisco Blogs
Simon Willison's Weblog
Simon Willison's Weblog
G
Google Developers Blog
酷 壳 – CoolShell
酷 壳 – CoolShell
博客园 - 叶小钗
T
The Blog of Author Tim Ferriss
博客园_首页
B
Blog
F
Fortinet All Blogs
AWS News Blog
AWS News Blog
V
Vulnerabilities – Threatpost
S
Secure Thoughts
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
Forbes - Security
Forbes - Security
S
Security @ Cisco Blogs
T
Threat Research - Cisco Blogs
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
S
Schneier on Security
Project Zero
Project Zero
Martin Fowler
Martin Fowler
C
Cybersecurity and Infrastructure Security Agency CISA
N
Netflix TechBlog - Medium
N
News and Events Feed by Topic

博客园 - 谭洪星

NHibernate教程(转载) MVC模式在.NET框架中的应用与实现 混乱的MVC,.NET非要MVC不可么?(转) ASP.NET实现URL映射 PetShop的系统架构设计(转) ASP.NET中常用的优化性能方法 设计模式学习笔记(三)——Abstract Factory抽象工厂模式 (转) 观察者模式及实现(转) 悟透JavaScript (转) 深入研究Asp.net页面的生命周期 [你必须知道的.NET] 第一回:恩怨情仇:is和as Net中的反射使用入门 .Net 中的反射(反射特性) - Part.3 .net反射简介 软件工程心理学之---让客户知错,但不能向你发怒 用AJAX.NET的客户端脚本实现UpdateProgress的效果 - 谭洪星 - 博客园 C#泛型之详解 [你必须知道的.NET]第十二回:参数之惑---传递的艺术(下) [你必须知道的.NET]第十一回:参数之惑---传递的艺术(上)
C#(也适用其他)的初学者对string是值类型还是引用类型搞不清楚,还有对参数传递也比较迷糊
谭洪星 · 2008-05-28 · via 博客园 - 谭洪星

 通过这个例子可能有点帮助

using System;
using System.Reflection;
using System.Runtime.InteropServices;

namespace StringTest
{
    
public class StringTest
    
{
        [STAThread]
        
static void Main() 
        
{
            StringTest tester 
= new StringTest();
            
string str = "a test string.";
            
string str1 = "a test string.";//和str一样的值。

            string str2 = str;
            Console.WriteLine(
"str = " + str);        //输出:a test string.
            Console.WriteLine("str1 = " + str1);    //输出:a test string.
            Console.WriteLine("str2 = " + str2);    //输出:a test string.
            Console.WriteLine(" ");
            
//使用反射技术把字符串的第4个字符修改为“E”
            typeof(string).InvokeMember("SetChar", BindingFlags.Default | BindingFlags.NonPublic | BindingFlags.Instance |BindingFlags.InvokeMethod, null, str, new object[]{3'E'});

            Console.WriteLine(
"str = " + str);        //输出:a tEst string.
            Console.WriteLine("str1 = " + str1);    //输出:a tEst string.
            Console.WriteLine("str2 = " + str2);    //输出:a tEst string.
            
//从上面的试验很清楚地看出string是引用类型,因为str,str1,str2 只有都指向一个对象,才会同时改变

                //可见在.NET中值相同的字符串在内存中是共用的。
            Console.WriteLine(" ");

            str2 
= "aa";        //把str2的值修改为“aa”
            tester.Test1(str1); //调用方法Test1
            Console.WriteLine("str = " + str);        //输出:a tWst string.
            Console.WriteLine("str1 = " + str1);    //输出:a tWst string.
            Console.WriteLine("str2 = " + str2);    //输出:aa
            Console.WriteLine(" ");
            
//从上面的试验可以看出,字符串的赋值运算符是新建一个对象,而不是修改原来对象的值
            
//还可以看出通过值传递引用类型参数时,传递的是对其数据的引用,而不是数据本身

            tester.Test2(
ref str);
            Console.WriteLine(
"str = " + str);    //输出:abcM
            Console.WriteLine("str1 = " + str1);//输出:a tWst string.
            Console.WriteLine("str2 = " + str2);//输出:aa.
            Console.WriteLine(" ");
            
//从上面的试验可以看出通过引用传递引用类型的作用:
            
//ref 方法参数关键字使方法引用传递到方法的同一个变量(既str)。
            
//在方法(Test2)中对参数所做的任何更改(src = "abcd")都将反映在该变量中(str)。
        }


        
public void Test1(string src)
        
{
            
//使用反射技术把字符串的第4个字符修改为“W”
            typeof(string).InvokeMember("SetChar", BindingFlags.Default | BindingFlags.NonPublic | BindingFlags.Instance |BindingFlags.InvokeMethod, null, src, new object[]{3'W'});
            src 
= "abcd";
        }


        
public void Test2(ref string src)
        
{
            src 
= "abcd";
            
//使用反射技术把字符串的第4个字符修改为“M”
            typeof(string).InvokeMember("SetChar", BindingFlags.Default | BindingFlags.NonPublic | BindingFlags.Instance |BindingFlags.InvokeMethod, null, src, new object[]{3'M'});
        }

    }

}