我想知道可以用c ++实现的东西,但我想用C#来实现。
如何从包含代码的类中向类传递“指针”,允许我以Foo.Bar()的形式编写代码?
namespace Example
{
public class Foo
{
MainClass MainClass;
public void Bar()
{
var somethingElse = MainClass.A.SomethingElse;
var somethingDifferent = MainClass.B.SomethingDifferent;
}
}
public class MainClass
{
public string Something;
public SubClassA A = new SubClassA(this); // <<-- not valid in c#
public SubClassB B = new SubClassB(this); // <<-- not valid in c#
}
public class SubClassA
{
private MainClass _MainClass;
public SubClassA(MainClass mainClass)
{
_MainClass = mainClass;
}
public string SomethingElse {
get {
return _MainClass.Something + " Else";
}
}
}
public class SubClassB
{
private MainClass _MainClass;
public SubClassB(MainClass mainClass)
{
_MainClass = mainClass;
}
public string SomethingDifferent
{
get
{
return _MainClass.Something + " Different";
}
}
}
}
我应该声明我知道我可以通过百万种方式重构我的代码以实现可行的结果,但我有一个我希望回答的具体问题! :)
由于
答案 0 :(得分:15)
您需要做的就是将初始化表达式移出字段声明并进入构造函数:
public class MainClass
{
public string Something;
public SubClassA A;
public SubClassB B;
public MainClass()
{
A = new SubClassA(this);
B = new SubClassB(this);
}
}
注意:
this
指针可能很危险。如果你正在调用的任何东西(在这种情况下是构造函数)回调到对象,它将在你没有完成初始化时运行代码。这有点像在构造函数中调用虚方法 - 它可以工作,但它会使代码变脆。Foo.MainClass
,因此您的Bar()
方法会因NullReferenceException
答案 1 :(得分:4)
在MainClass
中,您需要在SubClassA
构造函数中初始化SubClassB
A和MainClass
B(其中this
将具有有效的引用)。您当前正在初始化这些成员的位置超出了创建的MainClass
对象的上下文(因此出现错误)。