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

C#-检测对象引用何时更改,c#,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#中做到这一点吗 对不起,我的英语很差 提前感

请注意:

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#中做到这一点吗

对不起,我的英语很差


提前感谢

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

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

不需要重复使用y.

而不使用低级调试技术(比如VisualStudio调试代码时使用的技术),我认为没有一种简单的方法可以做到这一点

您要查找的是一个别名,而不是引用,据我所知,CLR不支持该别名


您可以通过编写
不安全的
代码来实现这一点,但我怀疑这样做可能会产生一些显著的副作用和并发症。

您似乎希望
X
成为指向
Y
的指针。C#中不直接支持指针(仅在不安全的代码中),但您可以通过使用闭包/lambda表达式进行一些小技巧来正确地实现这一点


尝试将其转换为C#(
指针结构)

无法(直接)执行您正在尝试的操作

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

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

然后,您仍然可以使用内部引用find Y-即使它没有保持完全相同。

最简单的解决方案是使用属性为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(refobjectobj)中并没有任何ref的意义。。它已经通过引用传递。

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

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
    设定器中
  • 通过
    YChanged
    事件
  • 通过子类化和重写
    OnYChanged

这也将实现结果,在“新建”操作时保留分配,假设在您的示例中,您正在使用许多不同的新闻,并且希望每次都更新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));


}

使用反射创建对象的实例,同时将其分配给keeper变量。这在很大程度上取决于问题的性质,即哪个是合适的解决方案。

您可以使用一个函数或属性设置Y,该函数或属性也可以设置x。但这是一件奇怪的事情。你只是好奇,还是想有所成就?此外,ref修饰符对已经是引用类型的参数不执行任何操作。@rossffabrican-re“不执行任何操作”。。。在这种情况下,当然-但它确实做了一些事情-我同意。看起来他试图模仿C++别名的行为,而不是CLR中通常发生的任何行为。仅仅通过OPs方法
GiveMeARef
就表明了对C#IMO中引用的错误理解。