【问题标题】:How to pass an instance of of a class from within that class如何从该类中传递该类的实例
【发布时间】:2014-07-25 14:42:38
【问题描述】:

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

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

谢谢

【问题讨论】:

  • 将您的属性实现为静态的,这将允许通过类型名称而不是实例来访问它
  • @DStanley OP 已经提出了一个具体问题。他只是重申这是他想要回答的这个问题。
  • @slippyr4 我看不出它是如何工作的?它需要一个实例?
  • @Beakie 我最初误解了这个问题 - OP 希望使用 Foo.Bar() 形式(其中 Foo 是一种类型)意味着 Bar() 需要是静态的(因为你可以' t 调用类型的实例方法)。现在我认为“Foo”部分要么模棱两可,要么是错字。
  • 回答您的问题:您可以在其构造函数/方法中传递this

标签: c# class pointers


【解决方案1】:

您需要做的就是将初始化表达式从字段声明中移到构造函数中:

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)我使用了公共字段,因为这个例子的语法更小。 2) 我很清楚这些危险。我在这里假设性地谈论。 3)我知道一个子类是一个派生类:)我认为这个名字可能对这个例子有意义。也许孩子会更好:) 4) 同样,这只是一段代码来说明我的观点。我不会运行它! :) 再次感谢,您的答案正是我想要的!
  • PSA,不要让乔恩伤心!对公共领域说“NO”!除非他们在 Cheapside。
  • 哈...让所有公共领域都抛在脑后。 55 分钟,我就下班了,直奔公共场所!
【解决方案2】:

MainClass 中,您需要在MainClass 构造函数中初始化SubClassA A 和SubClassB B(其中this 将具有有效引用)。您当前初始化这些成员的位置在创建的 MainClass 对象的上下文之外(因此出现错误)。

【讨论】:

    猜你喜欢
    • 2019-03-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多