为什么System.String像值类型一样? (如何写类似字符串的值类型?)

时间:2010-05-25 11:59:05

标签: c# .net

我想写一个行为类似于Value Type的'Date'类。 例如,不要编写克隆方法来安全地设置属性,而是使Date类按值传递:

public Date Birthday
        {
            get { return this.birthday; }
            set 
            { 
               this.birthday = value.Clone(); 
            } //I want to write this.birthday = value; 
              //without changing external value when this.Birthday changes
        }

我知道这是可能的,因为System.String是一个类,其行为类似于一个值。例如:

String s1 = "Hello";
String s2 = "Hi";
s1 = s2;
s2="Hello";
Console.WriteLine(s1);  //Prints 'Hi'

首先我认为这个类的编写器覆盖'='运算符,但现在我知道'='运算符不能被覆盖。那他们怎么写String类?

编辑:我只想让我的Date类按值传递它的实例,就像String一样。

3 个答案:

答案 0 :(得分:7)

首先,基于string的示例并未说明您的问题。

DateTimeString的内容是immutable:创建实例后,无法以任何方式更改。例如,只需说出DateTime即可向date.Minutes += 2个实例添加2分钟:您必须调用date.AddMinutes(2),这将产生一个全新的实例。

要使对象只读,只需遵循相同的模式。

答案 1 :(得分:4)

这不是'='运算符,而是当你说

stringThing = "thing";

您正在创建一个新字符串,而不是将当前字符串更改为其他字符串。

答案 2 :(得分:4)

public class Date{ ...code...}将是一个参考类型......不是你想要的。

public struct Date { ...code...}将是一个值类型......可能是你想要的。

字符串类是一个类,它是一个类,它是一个引用类型......并且是不可变的。如果是不可变的效果,字符串对象的行为在开始时可能会令人困惑。

给定string s1 = "Fish"; s1是指向“Fish”的引用......“鱼”位永远不能改变...... s1指向的内容可以改变。如果你然后分配s1 = "Tuna";“鱼”仍然存在,但不再被引用,将是GC。

在您的示例之后:s1=s2 s1,s2现在引用相同的字符串“Hi”...只有一个“Hi”。

我希望自己没有超过你的水平。