我认为这个问题在 C# 中被问过很多次,但我的问题可能更容易解决。
我有一个对象值作为字符串:myobject.value
并且我想将此值存储在队列(或其他任何东西)中以便以后访问它。是否可以?
我读了很多帖子说不可能将引用存储到字符串中。我没有看到任何解决方案可以将 ref 存储到我的字符串值myobject.value
并稍后更改它。
有任何想法吗 ?
如果您想存储对人们可以看到并共享您的更改的字符串的引用,则需要将其包装在一个类中:
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>
进一步学习该课程并为其提供隐式强制转换支持 to 和 from 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";
如果我理解正确,并且myobject.value
是 a string
,那么您当然可以存储代表这些值的集合
List<string> strLst = new List<string>();
strLst.Add(`myobject.value`);
不,您不能将引用存储为字符串,也不应该这样做,但是如果您确实需要,您可以创建一个字符串(或 xml)来表示有关您的对象的所有信息。