簡體   English   中英

如何確保將字符串數組作為字段的結構在分配給另一個變量時遵循值語義

[英]How to ensure a struct with a string array as a field would follow value semantics while assigning to another variable

MSDN文檔中 ,提到了“ 結構是在分配時復制的。將結構分配給新變量時,將復制所有數據,並且對新副本的任何修改都不會更改原始副本的數據。

我有一個具有字符串數組作為其中唯一字段的結構。

struct MyVar
{
    private readonly string[] value;
    MyVar(string[] iVal)
    {
        value = iVal;
    }
}

當我將一個結構變量分配給另一結構變量時,如何確保將字符串數組完全復制(深拷貝)到分配的變量。

您無法在C#中執行此操作,因為無法攔截編譯器生成的代碼以將結構的數據從一個復制到另一個。

您唯一能做的就是使您的結構完全不可變。

這意味着:

  • 創建該結構時,請對存儲在該結構內部的任何可變引用類型(例如示例中的字符串數組)進行防御性復制。
  • 不要將可變的引用類型對象傳遞給任何可以對其進行突變的對象。
  • 不要從結構中公開任何可變的引用類型。 那將意味着您無法從結構中公開字符串數組。
  • 不要做任何事情來改變結構中保存的任何引用類型。 因此,在您的示例中,您無法更改字符串數組的內容。

有很多限制。 最安全的方法是永遠不要在您的結構中存儲任何可變的引用類型。

無論如何,為了使您的結構更安全,您可以防御性地復制字符串數組:

struct MyVar
{
    private readonly string[] value;
    MyVar(string[] iVal)
    {
        value = (string[])iVal.Clone();
    }
}

現在可以安全地復制該特定示例,因為它無法更改字符串數組。 但是,一旦您添加了任何mutator方法或通過屬性公開了字符串數組,或者將其傳遞給可能對其進行變異的任何東西,您就會回到平方。

但是,如果要為結構創建“手動”副本,則可以通過序列化來實現。

只是您無能為力:

MyVar var1 = new MyVar(test);
MyVar var2 = var1;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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