2017-09-15 85 views
0

我有一個抽象類,它是通用的,像這樣:修改參考對象,以避免受保護的二傳手

class AbstractClass<T> 
{ 
    public T Data {get; protected set;} 
} 

在所有情況下,T是一個IEnumerable。在大多數情況下,它是一個List。但在特殊情況下,T可以是一個字符串,它是一個字符集合。 T是字符串時允許修改數據的最佳方法是什麼?

我的想法是簡單地獲取Data的值,然後爲其分配一個新值;

var data = Obj.Data; 
data = "string"; 

這會做我期望的嗎?有沒有什麼陷阱?有沒有更好的辦法?

編輯:

的根本原因設置器保護,是因爲它是最常見的集合,並且意圖是新構造函數集合。其次,我可能應該添加這個,Data對象可以是一個INotifyPropertyChanged。在課程的其餘部分有一些樣板代碼,但基本前提是我不想擔心跟蹤通知中Data的分配。

class Concrete<T> : AbstractClass<T> 
{ 
    public Concrete(T t) 
    { 
     Data = t; 
    }   
} 

string str = "String"; 
Concrete<string> blah = new Concrete<string>(str); 
Console.WriteLine(blah.Data); // "String" 
string temp = blah.Data; 
temp = "Assign"; 
Console.WriteLine(blah.Data); // "Assign" 

我想要最後一行打印「分配」,但它打印「字符串」。有沒有辦法在不改變保護的情況下完成此操作?我正在考慮用C++來修改地址。

+1

解釋你的問題更多一些。 – Amit

+0

爲什麼你需要修改字符串?爲什麼不公開setter或者用新的'Data'值來創建對象的新實例呢? – Kote

+0

字符串是C#中不可變的數據類型,你不能修改它。我不知道你爲什麼要這樣做,但也許使用char數組會更容易。 – tmlye

回答

0

C#string s是不可變的,所以你不能像編輯一樣編輯它們。

但是,還有其他類可以用作可變字符串。我將使用System.Text.StringBuilder

而不是給的string一個通用的說法,給它StringBuilder

string str = "String"; 
var blah = new Concrete<StringBuilder>(new StringBuilder(str)); 
Console.WriteLine(blah.Data); // "String" 
// to change the string to "Assign", call Clear() then Append() 
blah.Data.Clear(); 
blah.Data.Append("Assign"); 
Console.WriteLine(blah.Data);