如何从该类中传递类的实例

时间:2014-07-25 14:42:38

标签: c# class pointers

我想知道可以用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";
            }
        }
    }
}

我应该声明我知道我可以通过百万种方式重构我的代码以实现可行的结果,但我有一个我希望回答的具体问题! :)

由于

2 个答案:

答案 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对象的上下文(因此出现错误)。

相关问题