57 .net c# inner-classes
假设我在表单中有一个下拉列表,并且我在此类中有另一个嵌套类.现在,从嵌套类访问此下拉列表的最佳方法是什么?
Ray*_*yes 74
与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();
}
}
Run Code Online (Sandbox Code Playgroud)
请注意,InnerClass可以访问OuterClass的" s",我没有修改Raymond的代码(因为我链接到上面),所以请记住" string s;"是private因为没有指定其他访问权限.
Jon*_*eet 32
嵌套类型与Java中的内部类不同 - 没有包含类型的固有实例.(它们更像是Java中的静态嵌套类.)它们实际上是独立的类,有两个区别:
Outer<int>.Nested,不相同Outer<string>.Nested.Jas*_*aty 12
与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";
}
}
}
Run Code Online (Sandbox Code Playgroud)
因为到目前为止还没有人提到它:根据你的情况,如果成员变量也可以是静态的,你可以通过以下方式访问它.
class OuterClass
{
private static int memberVar;
class NestedClass
{
void SomeFunction() { OuterClass.memberVar = 42; }
}
}
Run Code Online (Sandbox Code Playgroud)
旁注:我有memberVar目的地(并且冗余地)标记private了嵌套类访问它的外部类的私有成员的给定能力.
在某些情况下,这可能是获取访问权限的最简单方法/解决方法,但......
静态还意味着,变量将在所有实例对象之间共享,具有所有缺点/后果(线程安全等)
静态也意味着,如果你有多个父类的实例,并且变量应该为每个实例保存一个单独的值,这显然不会起作用
所以在大多数情况下你可能想采用不同的方法......
正如大多数人所建议的那样(并且因为它也是最正确的答案),这里是一个将引用传递给外部类实例的示例.
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; }
}
}
Run Code Online (Sandbox Code Playgroud)