C# - 检测对象引用何时更改

时间:2009-05-10 18:34:31

标签: c#

说明:

object x;

void GiveMeARef(ref object obj)
{
   x = obj;
}

所以我希望X在Y改变时改变这个值。例如:

Y = new MyObject;
GiveMeARef(Y); //So x == Y;
Y = new OtherObject; // I want that X continues equals to Y, but it doesn't:\

如果有可能,任何人都知道如何在C#中做到这一点?

抱歉我的英语不好

提前致谢

7 个答案:

答案 0 :(得分:1)

这段代码有一个更大的问题...但为什么不这样做:

var y = new MyObject();
GiveMeARef(ref y);
var z = new MyObject();

无需重复使用y。

答案 1 :(得分:1)

没有进入低级调试技术(就像Visual Studio在调试代码时所使用的那样),我认为没有一种直接的方法可以做到这一点。

你要找的是别名,而不是参考,据我所知,CLR不支持。

您可以通过编写unsafe代码来完成此操作,但我怀疑这样做可能会产生一些重大的副作用和并发症。

答案 2 :(得分:1)

我真的不清楚你要做什么,但我会使用一个属性:

private SomeType y;
public SomeType Y {
   get { return y;}
   set {
       if(y!=value) {
           y = value;
           // run any "things to do when Y changes" code
           OnYChanged();
       }
   }
}
public event EventHandler YChanged;
protected virtual void OnYChanged() {
    EventHandler handler = YChanged;
    if(handler!=null) handler(this, EventArgs.Empty);
}

现在,您可以通过3种不同方式观察obj.Y的更改:

  • Y setter
  • 通过YChanged活动
  • 通过继承和覆盖OnYChanged

答案 3 :(得分:0)

您似乎希望X成为Y的指针。 C#中不直接支持指针(仅在不安全的代码中),但是你可以通过带有闭包/ lambda表达式的litte hack来正确实现这一点。

尝试将此VB-tip转换为C#(Pointer<T>-Structure

答案 4 :(得分:0)

没有办法直接做你正在尝试的事情。

我能想到的最接近的事情是将Y封装在其他类中,并让GiveMeARef()直接取代类实例而不是Y.这看起来像是:

myClass.Y = new MyObject();
GiveMeARef(ref myClass);
myClass.Y = new MyObject();

然后你仍然可以让内部参考找到Y - 即使它没有完全相同。

答案 5 :(得分:0)

最简单的解决方案是使用属性为Y赋值,并在setter函数中更新X:

private MyObject m_Y = new MyObject();

public MyObject Y
{
     get { return m_Y; }
     set
     {
         m_Y = value;
         X = value;      // Here ...
     }
}

另一种解决方案是创建一个新类MyObjectWrapper,然后处理它......

另一件事,GiveMeARef(ref object obj)中的'ref'没有任何意义..它已经通过引用传递了。

答案 6 :(得分:0)

这也可以实现结果,在“新”操作时保持分配,假设在您的示例中您使用了许多不同的新闻并希望每次都更新X.

private static object x;
private static object CreateNew(Type t) {
    object temp;
    temp = System.Activator.CreateInstance(t);
    x = temp;
    return temp;                      
}

static void Main(string[] args) {

    object o = CreateNew(typeof(int));           
    o = CreateNew(typeof(long));


}

使用反射创建对象实例并同时将其指定给守护程序变量的位置。这在很大程度上取决于问题的本质是什么是适当的解决方案。