[英]What is mutation in C#?
我正在閱讀 Joseph Albahari 的書“C# 10 in a Nutshell”,它談到了“匿名類型的非描述性突變”,但我什至不知道什么是突變,在谷歌上我只能找到“突變測試”或“什么是非破壞性突變?” 它們總是作為記錄類型的附帶功能而告終。 有人可以把它分解給我嗎? 一些例子將不勝感激!
突變(在“匿名類型的非破壞性突變”中使用的意義上)僅意味着更改 object 的 state 。 這是一個簡單的例子:
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
是一個可變的 class。 其他類,例如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
那么,如果我們想改變不可變 class 的內容,例如,將字符串的內容小寫,該怎么辦? 我們創建一個包含修改版本的新 object 。 這就是string.ToLower
所做的:
var s1 = "Hello";
var s2 = s1.ToLower();
Console.WriteLine(s1); // prints Hello
Console.WriteLine(s2); // prints hello
這稱為非破壞性突變:原始字符串s1
仍然存在,它沒有被破壞。 另一方面,第一個示例中的sb.Append("!")
具有破壞性:不再可訪問包含Hello
(不帶感嘆號)的sb
版本。
(顯然,您可以在小寫字符串時重復使用相同的變量名,例如s = s.ToLower()
。但這並不會改變ToLower
創建新的 object 而不是就地修改舊的這一事實s =...
確保變量s
之后指向新的 object。)
那么,這與匿名類型有什么關系呢? C# 中的匿名類型是不可變的:
var myObject = new { A = 1, B = 2 };
myObject.B = 3; // <- yields a compile-time error
C#9 引入了with
關鍵字,它允許您創建一個新的 object ,它是原始 object 的精確副本,除了您要更改的值:
var o1 = new { A = 1, B = 2 };
var o2 = o1 with { B = 3 };
// o1: A = 1, B = 2
// o2: A = 1, B = 3
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.