簡體   English   中英

C# 中的突變是什么?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM