gpt4 book ai didi

c# - 什么是 C# 中的突变?

转载 作者:行者123 更新时间:2023-12-05 01:50:05 45 4
gpt4 key购买 nike

我正在阅读 Joseph Albahari 的书“C# 10 in a Nutshell”,它谈到了“匿名类型的非破坏性突变”,但我什至不知道突变是什么,在谷歌上我只能找到“突变测试”或“什么是非破坏性突变?”他们总是以记录类型的附带功能结束。有人可以把它分解给我吗?一些例子将不胜感激!

最佳答案

变异(在“匿名类型的非破坏性变异”中使用的意义上)只是意味着改变对象的状态。这是一个简单的例子:

var sb = new StringBuilder("Hello");

// We mutate the object referenced by sb, so that it contains
// "Hello!" rather than "Hello".
sb.Append("!")

Console.WriteLine(sb.ToString()); // prints Hello!

StringBuilder 是一个可变 类。其他类,例如 String,是不可变的:

var s = "Hello";

// The following expression returns a *new* string "hello",
// but does not mutate the original string itself.
s.ToLower();

Console.WriteLine(s); // still prints Hello

那么,如果我们想改变不可变类的内容,例如,将字符串的内容小写,我们该怎么办?我们创建一个包含修改后版本的新对象。这就是 string.ToLower 所做的:

var s1 = "Hello";
var s2 = s1.ToLower();

Console.WriteLine(s1); // prints Hello
Console.WriteLine(s2); // prints hello

这称为非破坏性变异:原始字符串s1 仍然存在,它没有被破坏。另一方面,第一个示例中的 sb.Append("!")破坏性的:包含 sb 版本你好(没有感叹号)不再可用。

(显然,您可以在将字符串小写时重复使用相同的变量名,例如 s = s.ToLower()。但这不会改变 ToLower 创建一个新对象,而不是就地修改旧对象。s = ... 确保变量 s 之后指向新对象。 )


那么,这与匿名类型有什么关系呢? C# 中的匿名类型是不可变的:

var myObject = new { A = 1, B = 2 };

myObject.B = 3; // <- yields a compile-time error

C#9 引入了 with 关键字,它允许您创建一个新对象,它是原始对象的精确副本,除了您想要的值改变:

var o1 = new { A = 1, B = 2 };
var o2 = o1 with { B = 3 };

// o1: A = 1, B = 2
// o2: A = 1, B = 3

关于c# - 什么是 C# 中的突变?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73429970/

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