2012-07-12 68 views
1

我認爲這個問題曾多次在C#中提出過,但我的問題可能更容易解決。
我有一個對象值作爲字符串:myobject.value,我想將這個值存儲在一個隊列(或其他任何)來稍後訪問它。可能嗎?存儲對象字符串參考

我讀了很多帖子,說不可能將ref存儲到字符串中。 我沒有看到任何解決方案存儲ref我的字符串值myobject.value並稍後更改。

任何想法?

+0

http://stackoverflow.com/questions/1189271/store-a-reference-to-a-string – 2012-07-12 14:25:43

+0

爲什麼不存儲對擁有該字符串的* object *的引用?也許你需要重新考慮你的對象,因爲此時你正在使用它們作爲公共屬性的簡單容器。 *要求對象通過方法更新字符串...對象方向和數據封裝好得多。 – Tony 2012-07-12 14:29:34

回答

3

如果你想存儲到一個字符串的引用,人們可以看到並分享你的改變將需要將其包裝在一個類:

public class Wrapper<T> 
{ 
    public T Item { get; set; } 
} 

那麼,人們用這個,而不是一個字符串:

class MyClass 
{ 
    public Wrapped<string> SharedString { get; set; } 
} 

var c1 = new MyClass(); 
var c2 = new MyClass(); 

var s = new Wrapped<string> { Item = "Hello" }; 

c1.SharedString = s; 
c2.SharedString = s; 

c1.SharedString.Item = "World"; 
Console.Writeline(c2.SharedString.Item); 

儘管字符串是引用類型,但它們是不可變的,所以需要對「複製」進行修改。共享是這種方式不會改變不變性,它只是集中持有一個字符串的副本,每個人都通過參考Wrapped<string>來查看。

可以進一步採取Wrapped<T>類,並給它隱式轉換的支持,並從T,一小語法糖:

public static implicit operator T(Wrapped<T> wrapper) 
{ 
    return wrapper.Item; 
} 

public static implicit operator Wrapped<T>(T item) 
{ 
    return new Wrapped<T> { Item = item }; 
} 

Wrapped<int> i = 2; 
int j = i; 

// Careful, this is a re-assignment of s, not a change of s.Item. 
Wrapped<string> s = "Hello"; 
0

如果我理解你的權利,並myobject.valuestring,比你能當然存儲代表這些價值

List<string> strLst = new List<string>(); 
strLst.Add(`myobject.value`); 

不,你不能存儲引用作爲一個字符串的集合,你也不應該有,但你可以做一個字符串(或XML)代表所有關於你的對象的信息,如果你真的需要的話。