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中引用的错误理解。