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

推荐订阅源

IT之家
IT之家
Recent Announcements
Recent Announcements
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
The GitHub Blog
The GitHub Blog
MyScale Blog
MyScale Blog
爱范儿
爱范儿
GbyAI
GbyAI
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
美团技术团队
Y
Y Combinator Blog
博客园 - 叶小钗
Apple Machine Learning Research
Apple Machine Learning Research
Martin Fowler
Martin Fowler
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
罗磊的独立博客
M
MIT News - Artificial intelligence
博客园 - Franky
V
Visual Studio Blog
I
InfoQ
V
V2EX
Hugging Face - Blog
Hugging Face - Blog
腾讯CDC
博客园 - 司徒正美
L
LangChain Blog

博客园 - 尉迟方

华容道研究 - 华容道资料大全 - 华容道完全求解 最近做的在线游戏:华容道(53关),界面古朴典雅,过关过程可回放 zz代码发芽网更新 - 界面清晰、支持论坛(Discuz!)、一键复制HTML/BBcode 代码发芽网更新了22个颜色主题zz 代码发芽网(Beta版)发布,欢迎测试、试用zz 如何编写PocketPC上的输入法 如何向目标窗口发送一个Unicode 字符? firefox使用技巧 - 公司内部站点 如何实现快速的diff工具(windiff, winmerge)? 决定搬家到 http://www.2maomao.com/blog/ ,这里以后只更新一些技术问题 如何搞定Bluehost.com上面wordpress中文版 整理了一下IE的右键菜单 - 直接禁止add on,爽 猛烈推荐开源编辑器notepad2,替换notepad 搞笑创意 zz 消遣一下:这舞跳的真tmd绝了 Bill Gate & Microsoft Windows's *BLUE* time. 中国工商银行网上银行,客户权利那么少,义务那么多,敢开吗? 争论webos是否是os有什么意义? 以前看古龙时的选摘
C# String 的问题:immutable why? how? 传值?传引用?strin...
尉迟方 · 2006-03-24 · via 博客园 - 尉迟方

今天突然用到C#的string,突然想起来一直没弄明白string和String有什么区别,查了一下电子书、MSDN以及百度和Google,更进一步看看String的一些问题。

0.  问题:

1. C#到底是什么时候传引用?什么时候传值?
2. String传值还是传引用
3. string和String有什么区别?
4. String为什么是Immutable,怎么实现的?

以下查询结果以及我的理解:


1. C#到底是什么时候传引用?什么时候传值?
传值的情况 :Struct、Enumeration、Numeric(Integral/Floating/decimal)、bool
传引用的情况:class、Delegate、Interface

当使用操作符"="以及函数传参数的时候:
      传值的结果是把原对象复制了一份,接收者指向原对象。
      传引用的结果是直接让接收者指向原对象。

有人说,我硬要把值当引用传怎么办?

a、用ref关键字

b、用数组,数组是class

c、凉拌:)

2. String传值还是传引用
C#的String声明是class String,当然是传引用。

不过,之所以有这个疑惑,多数是因为这个情况:

string a = "aaa";

string b = a;

b = "bbb";

或者是这么几行代码:

public void Swap(string s1, string s2)

{

    string temp=s1;

    s1=s2;

    s2=temp;

}

这时候结果一打印,结果发现a的值还没有变,Swap也没有成功,这时候就会有幻觉:是不是没有传引用啊?

呵呵,string不会这么粗暴的打乱“声明为class就是传引用”这种规则的。

分析一下:

string a = "aaa"; //==> a----->new String("aaa")

string b = a;        //==> b----->a, 传引用

b = "bbb";          //==> b----->new String("bbb"), 传引用,b指向了一个新的字符串,a并没有变。

Swap函数也是这样,比如说传了a, b进去(a="aaa", b="bbb"),

    //s1----->a, s2----->b

    string temp=s1;//temp----->s1----->a

    s1=s2;               //s1----->s2----->b;

    s2=temp;          //s2----->temp----->a

结果是,s1和s2确实是Swap了,但是这种结果并不会影响到a和b

MSDN中对string的说明:string is an alias for String in the .NET Framework

呵呵string是String的别名而已,都是一家。

4. String为什么是Immutable,怎么实现的?
immutable:对象一旦生成不可改变

关于怎么实现的,在明白了问题2之后很好办,只要不提供任何修改自己成员变量的方法就可以了。顺便声明为sealed,防止不清楚的后来者违反规定:)

String每个看似修改了成员变量的方法,事实上都返回了一个新的String。

比如String.Replace函数,事实上并没有改变原来的串,这也是为什么只有让str = str.Replace( foo, bar )才真正完成替换的原因。

关于为什么是immutable,参见:

5. 更多讨论参见: