簡體   English   中英

將只讀結構作為“in”參數傳遞?

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

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