说明:
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#中做到这一点?
抱歉我的英语不好
提前致谢
答案 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));
}
使用反射创建对象实例并同时将其指定给守护程序变量的位置。这在很大程度上取决于问题的本质是什么是适当的解决方案。