Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/267.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# - Fatal编程技术网

C# C“参考类型和”之间的差异;可变的;概念?

C# C“参考类型和”之间的差异;可变的;概念?,c#,C#,你能解释一下C#中引用类型和可变概念的区别吗? 字符串是引用类型,但不可变。请详细说明这两个概念之间的概念差异,以及为什么它们是独立的 它们是正交的- 可变=属性可以更改 Reference type=value实际上是对实例的引用 不要求引用类型是可变的,反之亦然字符串是不可变的引用类型。结构不是引用类型,可以是可变的,但最佳实践是它们是不可变的。引用与值类型指的是复制语义。传递的引用类型不会被复制,它的引用(“地址”)会被复制。值类型会被完全复制。易变性与此正交。可以有可变的值类型和不可

你能解释一下C#中引用类型和可变概念的区别吗? 字符串是引用类型,但不可变。请详细说明这两个概念之间的概念差异,以及为什么它们是独立的

它们是正交的-

  • 可变=属性可以更改
  • Reference type=value实际上是对实例的引用

不要求引用类型是可变的,反之亦然<代码>字符串是不可变的引用类型。结构不是引用类型,可以是可变的,但最佳实践是它们是不可变的。

引用与值类型指的是复制语义。传递的引用类型不会被复制,它的引用(“地址”)会被复制。值类型会被完全复制。易变性与此正交。可以有可变的值类型和不可变的引用类型。

字符串是引用类型,因为它可能很大,因此无法像值类型那样放在堆栈中。它仍然是不可更改的,因为您不更改它的值,而是复制并更改副本的值。

这是一个家庭作业问题吗?这个问题似乎是离题的,因为它似乎是一个家庭作业问题,没有表现出任何努力,它实际上并不是关于一个特定的编码问题,但它对未来在这个主题上的搜索仍然是有价值的。我们喜欢与否,但它正成为“研究”东西的标准场所。@AZ:这个问题甚至不可回答;这就像问“我的房子的地址和我房子的颜色有什么区别?”你是如何开始回答这样的问题的?@Eric-通过提供地址和颜色的定义。然后说明为什么它们是不相关的。但是,是的,你有一个pointValue类型不必在堆栈上。大多数时候,情况并非如此。只有局部函数变量是(在某些情况下甚至不是)-这只是一个实现细节。你的论点不正确valid@AZ,你认为杰夫的论点无效的结论是无效的;)字符串成为ref类型的主要原因确实与内存有关(,例如)@elongzo。但与堆栈无关,更多的是关于复制大量数据——这就是结构的全部内容(复制)。这是一个重要的区别。在编程界有一个关于结构的巨大误解,每次谈论结构时,它们都会与“堆栈”放在同一句话中。这是错误的。@elongzo-也没有什么可以阻止字符串成为一个值类型,它包含对字符数组的引用。这与内存问题没有任何关系,可能是一个完全合理和最佳的实现。这里的推测是:string实际上只包含对char数组的引用。我假设他们将其设置为ref类型,以便在构造时涉及GC,并且在特殊情况下也会涉及数组的分配(字符串获得自己的特殊堆)。否则,GC在分配时很难知道字符数组是否是字符串的一部分(结构不是由GC分配的——在很多情况下是这样,但我希望您能理解我的观点)