gpt4 book ai didi

c# - 为什么 C# 结构是不可变的?

转载 作者:IT王子 更新时间:2023-10-29 03:47:13 25 4
gpt4 key购买 nike

我只是想知道为什么结构、字符串等是不可变的?使它们不可变而其余对象可变的原因是什么。哪些东西被认为可以使对象不可变?

可变和不可变对象(immutable对象)的内存分配和释放方式有何不同?

最佳答案

如果您对这个主题感兴趣,我在 https://ericlippert.com/2011/05/26/atomicity-volatility-and-immutability-are-different-part-one/ 上有很多关于不可变编程的文章

I was just curious to know why structs, strings etc are immutable?

默认情况下,结构和类不是不可变的,尽管使结构不可变是最佳实践。我也喜欢不可变类。

字符串是不可变的。

What is the reason for making them immutable and rest of the objects as mutable.

使所有类型不可变的原因:

  • 关于不变的对象更容易推理。如果我有一个包含三个项目的队列,我知道它现在不是空的,五分钟前它不是空的,将来也不会是空的。它是不可改变的!一旦我知道了关于它的一个事实,我就可以永远使用这个事实。关于不可变对象(immutable对象)的事实不会过时。

  • 第一点的特例:不可变对象(immutable对象)更容易实现线程安全。大多数线程安全问题是由于在一个线程上写入而在另一个线程上读取造成的;不可变对象(immutable对象)没有写入。

  • 不可变对象(immutable对象)可以拆开并重新使用。例如,如果你有一个不可变的二叉树,那么你可以使用它的左右子树作为一棵不同树的子树而不用担心它。在可变结构中,您通常最终会制作数据副本以重新使用它,因为您不希望对一个逻辑对象的更改影响另一个逻辑对象。这可以节省很多时间和内存。

使结构不可变的原因

有很多理由使结构不可变。这只是一个。

结构是按值复制的,而不是按引用复制的。很容易不小心将结构视为通过引用复制。例如:

void M()
{
S s = whatever;
... lots of code ...
s.Mutate();
... lots more code ...
Console.WriteLine(s.Foo);
...
}

现在您想将部分代码重构为辅助方法:

void Helper(S s)
{
... lots of code ...
s.Mutate();
... lots more code ...
}

错了!那应该是 (ref S s)——如果你不这样做,那么突变将发生在 s 的副本上。如果您一开始就不允许突变,那么所有这些问题都会消失。

使字符串不可变的原因

还记得我关于不可变结构保持事实的事实的第一点吗?

假设字符串是可变的:

public static File OpenFile(string filename)
{
if (!HasPermission(filename)) throw new SecurityException();
return InternalOpenFile(filename);
}

如果恶意调用者在安全检查之后和文件打开之前改变了文件名怎么办?该代码刚刚打开了一个他们可能没有权限的文件!

同样,可变数据很难推理。您希望“此调用者有权查看此字符串描述的文件”这一事实永远,而不是直到发生突变。对于可变字符串,为了编写安全代码,我们必须经常制作我们知道不会更改的数据副本。

What are the things that are considered to make an object immutable?

类型是否在逻辑上代表了某种“永恒”的值(value)?数字12就是数字12;它没有改变。整数应该是不可变的。点(10, 30)就是点(10, 30);它没有改变。点应该是不可变的。字符串“abc”就是字符串“abc”;它没有改变。字符串应该是不可变的。列表 (10, 20, 30) 没有改变。等等。

有时类型代表确实发生变化的事物。玛丽史密斯的姓是史密斯,但明天她可能是玛丽琼斯。或者今天的史密斯小姐明天可能就是史密斯医生。外星人现在有 50 点生命值,但在被激光束击中后只有 10 点。有些事情最好表示为突变。

Is there any difference on the way how memory is allocated and deallocated for mutable and immutable objects?

不是这样的。正如我之前提到的,不可变值的好处之一是您可以在不复制的情况下重复使用它们的一部分。所以从这个意义上说,内存分配可能非常不同。

关于c# - 为什么 C# 结构是不可变的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3751911/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com