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