Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/314.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/google-apps-script/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# C语言中的不可变类型#_C#_.net - Fatal编程技术网

C# C语言中的不可变类型#

C# C语言中的不可变类型#,c#,.net,C#,.net,我试图理解不可变的类型。我知道字符串是不可变的,以及匿名类型delagates,但是这个呢?其中哪些在C中是不可变的?为什么?你能解释一下吗? DataSet、Label、DateTime、object、ArrayList是一个结构(=值类型)且不可变,但其余(DataSet、Label、object、ArrayList)是可变的: 无法编辑类型为DateTime的对象-其上的所有方法都返回一个新的DateTime对象。所有其他的都可以更改。 对象有点特殊,因为它可以是“任何东西”,所以它不被称

我试图理解不可变的类型。我知道字符串是不可变的,以及匿名类型delagates,但是这个呢?其中哪些在C中是不可变的?为什么?你能解释一下吗?
DataSet、Label、DateTime、object、ArrayList

是一个
结构(=值类型)且不可变,但其余(
DataSet、Label、object、ArrayList
)是可变的:

无法编辑类型为
DateTime
的对象-其上的所有方法都返回一个新的
DateTime
对象。所有其他的都可以更改。
对象
有点特殊,因为它可以是“任何东西”,所以它不被称为不可变的


一般来说,“不可变”意味着对象在创建后不能更改。正如Tim正确指出的那样,结构默认情况下是可变的,但通常以不变的方式实现。因此,值类型可以是可变的,但大多数情况下不是。例如,使用可变值类型时会发生什么情况。

DataTime
s是不可变的,
对象有一个不可变的接口,尽管实际类型可能是可变的。其余的是可变的。
ArrayList
是可变的(您可以更改
ArrayList
中的项:
a[1]=a[0]
)让他人完成分配任务的好方法:这是对不可变对象好处的一个很好的解释,我推荐Eric Lipperts关于不可变的文章,从第一部分开始:
object
s不一定是可变的:
object o=new object()
是不可变的,并且不能通过
object
的变量类型进行变异。值得一提的是,像
structs
这样的值类型可以是可变的,尽管它们大部分是不可变的。如果类型是可变的,则取决于实现。@ChrFin:正如您所说,对象可以是任何东西。但是,如果像Lee那样创建一个“空白”对象,它是不可变的,因为没有要修改的属性或字段。您想如何修改没有任何更改的内容@蒂姆施梅尔特:谢谢你的反馈。我知道这一点,但我仍然不确定它现在被称为“不可变”还是“可变”(或者两者都不是)?可能
object
作为一个值是不可变的,但作为一个类型它是可变的/两者都不是?“可变”只是意味着您可以更改它,而无需创建一个必须重新分配的新实例。因此,如果一个类型有可以通过属性或方法直接或间接修改的字段,那么它是可变的,否则就不可变了。因此,只允许构造函数“更改”不可变类型中的类。通过不提供更改这些字段的公共属性设置器、公共字段或公共方法,可以使类不可变。