什么';s是从嵌套类访问封闭类中字段的最佳方式
本文关键字:字段 方式 最佳 访问 什么 嵌套 | 更新日期: 2023-09-27 17:47:49
假设我在表单中有一个下拉列表,并且我在这个类中有另一个嵌套类。现在,从嵌套类访问此下拉列表的最佳方式是什么?
与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
,因为没有指定其他访问权限。
- 如果包含类型是泛型的,则嵌套类型会被包含类型有效地参数化,例如
Outer<int>.Nested
与Outer<string>.Nested
不同 - 嵌套类型可以访问包含类型中的私有成员
与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";
}
}
}
静态成员
由于到目前为止还没有人提到它:根据您的情况,如果成员变量也可以是静态,您可以通过以下方式访问它。
class OuterClass
{
private static int memberVar;
class NestedClass
{
void SomeFunction() { OuterClass.memberVar = 42; }
}
}
旁注:我有目的地(和冗余地)将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; }
}
}
另一种在某些情况下很有用的方法是从外部类派生嵌套类。像这样:
class Outer()
{
protected int outerVar;
class Nested() : Outer
{
//can access outerVar here, without the need for a
// reference variable (or the associated dot notation).
}
}
我使用过这种技术,尤其是在结构化单元测试的上下文中。(这可能不适用于OP的特定问题,但它通常对嵌套类有帮助,就像这个"重复"问题的情况一样:"我可以访问内部类中的外部类对象吗")
您可以将封闭类作为参数传递给嵌套类构造函数,如下所示:
private NestedClass _nestedClass;
public ParentClass()
{
_nestedClass = new NestedClass(this);
}
通常不建议使用嵌套类,它们应该是私有的和/或内部的。不过,在我看来,它们有时是有用的。
如果我错了,请纠正我,您正试图从内部类处理外部控件,因此遇到了这种情况。更好的方法是以事件驱动的方式处理事务。使用Observer模式,在外部控件上注册一个监听器(您的嵌套/内部类将是监听器)。让生活更简单。恐怕这不是你所期望的答案!
将master类作为构造函数参数发送到嵌套(内部)类。
上面有一个很好的答案,但我喜欢写一些
c#嵌套类默认为私有
私有到包含类如果您想使用它,它必须是公共的