[英]Passing a readonly struct as an “in” parameter?
根據in參數修飾符的所有已知規律,任何傳遞的 object 都將通過引用傳遞,但不能被調用的方法修改。
所以我發現微軟關於如何編寫安全高效的 C# 代碼的建議令人困惑:
聲明一個只讀結構來表示一個類型是不可變的。 這使編譯器能夠在使用 in 參數時保存防御性副本。
切勿將結構作為 in 參數傳遞,除非它使用 readonly 修飾符聲明或該方法僅調用結構的只讀成員。 違反本指南可能會對性能產生負面影響,並可能導致行為不明。
如果方法不允許修改它,為什么編譯器會在使用“in”參數時保存防御性副本?
如果不允許方法修改它,如何將非只讀結構作為 in 參數傳遞會對性能產生負面影響並導致晦澀的行為?
例如:
public struct Test
{
public int Value;
public void SetValue(int value) => Value = value;
}
public static void Method(in Test test)
{
test.SetValue(5);
Console.WriteLine(test.Value); // 0
}
這將編譯得很好。 如果我正確理解這種情況,則不會在調用構造函數時創建副本,而是在調用任何可能改變值的方法時創建副本。
使結構只讀將防止調用任何變異方法,因此將避免隱藏副本。
還有很好的 arguments 為什么可變結構是邪惡的,所以我主張只將所有結構設為只讀。 IE
public readonly struct Test
{
public int Value { get; }
public Test(int v) => Value = v;
// Any "mutating" method should create a copy instead
public Test WithValue(int v) => new Test(v);
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.