我想写一个行为类似于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一样。
答案 0 :(得分:7)
首先,基于string
的示例并未说明您的问题。
DateTime
和String
的内容是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”。
我希望自己没有超过你的水平。