从嵌套类访问封闭类中字段的最佳方法是什么?

说如果我有一个窗体中的下拉列表,并且在这个类中有另一个嵌套的类。 现在从嵌套类访问这个下拉菜单的最好方法是什么?

与Java不同,嵌套类不是一个特殊的“内部类”,所以你需要传递一个引用。 Raymond Chen有一个例子描述了这里的区别: C#嵌套类就像C ++嵌套类,而不是Java内部类 。

这里是一个例子,其中嵌套类的构造函数传递外部类的实例供以后参考。

// C# class OuterClass { string s; // ... class InnerClass { OuterClass o_; public InnerClass(OuterClass o) { o_ = o; } public string GetOuterString() { return o_.s; } } void SomeFunction() { InnerClass i = new InnerClass(this); i.GetOuterString(); } } 

请注意,InnerClass可以访问OuterClass的“ s ”,我没有修改Raymond的代码(因为我链接到上面),所以请记住,“ string s; ”是private因为没有指定其他访问权限。

嵌套types不像Java中的内部类 – 没有包含types的固有实例。 (它们更像Java中的静态嵌套类。)它们是有效的独立类,有两个区别:

  • 如果包含types是通用的,嵌套types通过包含types被有效地参数化,例如Outer<int>.NestedOuter<string>.Nested
  • 嵌套types可以访问包含types的私有成员。

与Java不同的是,在C#中没有对包含类的实例的隐式引用。

您需要将这样的引用传递给嵌套类。 一个典型的方法是通过嵌套类的构造函数。

 public partial class Form1 : Form { private Nested m_Nested; public Form1() { InitializeComponent(); m_Nested = new Nested(this); m_Nested.Test(); } private class Nested { private Form1 m_Parent; protected Form1 Parent { get { return m_Parent; } } public Nested(Form1 parent) { m_Parent = parent; } public void Test() { this.Parent.textBox1.Text = "Testing access to parent Form's control"; } } } 

静态成员

由于目前还没有人提到它, 根据你的情况 ,如果成员variables也可以是静态的 ,你可以简单地通过下面的方式访问它。

 class OuterClass { private static int memberVar; class NestedClass { void SomeFunction() { OuterClass.memberVar = 42; } } } 

旁注:我有目的地(和冗余地)标记memberVar作为private来说明嵌套类访问它的外部类的私有成员的给定能力。

谨慎/请考虑

某些情况下,这可能是获得访问权限的最简单的方法/解决方法,但是…

  • 静态也意味着variables将在所有实例对象之间共享,所有的缺点/后果(线程安全等)

  • 静态也意味着,如果你有多于一个父类的实例,并且variables应该为每个实例保存一个单独的值,这显然不起作用

所以在大多数情况下,你可能想用不同的方法去…

通过参考

正如大多数人所build议的(因为这也是最正确的答案),下面是一个将引用传递给外部类实例的示例。

 class OuterClass { private int memberVar; private NestedClass n; OuterClass() { n = new NestedClass(this); } class NestedClass { private OuterClass parent; NestedClass(OuterClass p) { parent = p; } SomeFunction() { parent.memberVar = 42; } } } 

另外一种在某些情况下很有用的方法是从外部类派生嵌套类。 像这样:

 class Outer() { protected int outerVar; class Nested() : Outer { //can access outerVar here, without the need for a // reference variable (or the associated dot notation). } } 

我特别在结构化unit testing中使用了这种技术。 (这可能不适用于OP的特定问题,但是对于一般的嵌套类可能会有所帮助,例如:“ 我可以访问内部类中的外部类对象 ”

纠正我,如果我错了,你正试图从内部类处理外部控制,因此你遇到了这个。 这样做的一个更好的方法是以事件驱动的方式处理事务。 使用观察者模式,在外部控件上注册一个监听器(你的嵌套/内部类将是监听器)。 使生活更简单。 恐怕这不是你所期待的答案!

您可以将封闭类作为parameter passing给嵌套类构造函数,如下所示:

 private NestedClass _nestedClass; public ParentClass() { _nestedClass = new NestedClass(this); } 

嵌套类通常不被推荐,应该是私有的和/或内部的。 他们在我看来有时候是有用的。

将主类作为构造函数参数发送给嵌套(内部)类。