【问题标题】:Store object string reference存储对象字符串引用
【发布时间】:2012-07-12 14:22:46
【问题描述】:

我认为这个问题在 C# 中被问过很多次,但我的问题可能更容易解决。
我有一个对象值作为字符串:myobject.value,我想将此值存储在队列(或其他任何东西)中以便以后访问它。有可能吗?

我读了很多帖子说不可能将 ref 存储到字符串。 我没有看到任何解决方案可以将引用存储到我的字符串值 myobject.value 并稍后更改。

有什么想法吗?

【问题讨论】:

  • 为什么不存储对拥有该字符串的 object 的引用?也许您需要重新考虑您的对象,因为此时您将它们用作公共属性的简单容器。 要求对象通过方法更新字符串要好得多...面向对象和数据封装。

标签: c# string pointers


【解决方案1】:

如果您想存储对人们可以看到的字符串的引用并共享您的更改,则需要将其包装在一个类中:

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&lt;string&gt; 来查看的字符串的一个副本。

您可以进一步使用Wrapped&lt;T&gt; 类,并为其提供与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"; 

【讨论】:

    【解决方案2】:

    如果我理解正确,并且myobject.valuestring,那么您当然可以存储代表这些值的集合

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

    不,您不能将引用存储为字符串,也不应该这样做,但是如果您确实需要,您可以创建一个字符串(或 xml)来表示有关您的对象的所有信息。

    【讨论】:

      猜你喜欢
      • 2013-09-14
      • 1970-01-01
      • 2019-02-01
      • 1970-01-01
      • 1970-01-01
      • 2021-01-20
      • 2010-11-12
      • 2013-09-11
      • 2013-07-03
      相关资源
      最近更新 更多