在C ++中我会使用Type ** var来做到这一点。这是如何在C#中完成的?这是一个正在发生的事情的例子。这是非常粗略的伪代码...
Class Main{
class DataObj {...};
class Param
{
public DataObj obj;
public CBFunc f;
}
// Start a load, DataObj o should be set once the load is complete
void Load(string fn, DataObj o, CBFunc func)
{
Param p = new Param();
p.obj = o;
p.f = func;
// will call the CBFunc when done...
LoadWithCB(fn, CBFunc, p);
}
void CBFunc(Param p, DataObject o)
{
// DataObj o is what was loaded. p.obj is set to o...
p.obj = o;
p.f();
}
DataObj A;
void Init()
{
Load("...",A, MyCBFunc);
}
void MyCBFunc()
{
//A now is filled out
A.whatever();
}
}
请注意,此代码无法正常工作且vars的输入错误...我只是不知道应该用什么类型来实现这个...
所以需要的是拥有一个DataObj A,调用Init加载并稍后调用函数MyCBFunc。此时应该填写A.在C ++中,我会传递一个** var,然后可以取消引用并正确设置正确地填充变量。
那么有没有办法将A传递给Load,以及签名上应该包含的类型以及Param中DataObj obj的声明是否允许将其作为引用传递?
这是在托管C#中。
答案 0 :(得分:2)
您存储引用变量(您永远不会猜到这一点)....使用引用类型的类成员变量。
class RefHolder<T>
{
public T ptr;
}
现在你可以整天使用多个间接:
RefHolder<RefHolder<RefHolder<string>>>
如果您将RefHolder<string>
传递给其他组件,则可以稍后更改其ptr
值,然后该组件可以访问您的新string
。