C#中的嵌套类

Posted

技术标签:

【中文标题】C#中的嵌套类【英文标题】:Nested class in C# 【发布时间】:2013-02-27 06:40:54 【问题描述】:

我正在尝试研究 c# 中的嵌套类。在阅读了许多文档和凝视之后,我仍然不清楚何时使用嵌套类。但据我了解,我做了一个小示例程序。我在下面粘贴我的代码。这个嵌套类程序是否以正确的逻辑实现? .嵌套类实际上使用的是什么 for ?而且我对这个程序有疑问,我在程序中指定了这个疑问。请帮帮我...

public partial class Form1 : Form

    public Form1()
    
        InitializeComponent();

        Bank bankObj = new Bank();
        bankObj.CreateAccount();
        bankObj.ShowMyAccountNumber();
    


class Bank

    static int accountNumber; //  here if I just declare this as int accountNumber without static it showing an error in the CreatePersonalAccount(int accNo) method's first line ie accountNumber = accNo; as "Cannot access a non-static member of outer type." What actually this error mean ?

    public class BankAccountSection
    
        public bool CreatePersonalAccount(int accNo)
        
            accountNumber = accNo;
            return true;
        
    

    public void CreateAccount()
    
        bool result = new BankAccountSection().CreatePersonalAccount(10001);
    

    public void ShowMyAccountNumber()
    
        MessageBox.Show(accountNumber.ToString());
    

【问题讨论】:

您的代码根本没有显示嵌套类。它有两个独立的***类。 @Jon, BankAccountSection 嵌套在 Bank Imo/ime 嵌套类没多大用处 【参考方案1】:

嵌套类通常用于在封闭(外部)类之外没有用处的小型实用程序类。因此,嵌套类通常是private。 (甚至还有一个FxCop rule。)

您的代码

在您的情况下,嵌套类 BankAccountSection 并不是很有用,因为它本身没有状态。 CreatePersonalAccount 也可能只是外部类的一个方法。

关于static int accountNumber;:这将使accountNumber 成为跨所有 Bank 对象的共享字段,这违背了整个目的。不要那样做。如果确实需要在内部类中设置Bank对象的字段,则需要将Bank对象的引用传递给内部类。 (这与 Java 不同,后者在某些情况下会自动获得此类引用。)在您的特定情况下,只需摆脱内部类即可。

合法用例示例

您的方法中有一个大型算法。您意识到使用许多小方法和实例变量将该算法提取到它自己的类中会增加可读性。由于该算法非常具体并且可能对其他类没有用,因此您将算法放入内部类中。因此,您可以避免将外部类与仅由该算法使用的实例变量混淆。 您创建了一个 List 数据结构,该结构在内部实现为 linked list。由于您不向外界公开列表节点,因此您将节点设为内部类。

相关:

Why/when should you use nested classes in .net? Or shouldn't you?

【讨论】:

我建议,如果 Thing 定义了一个类型,其实例将存在以作用于特定实例,则将类型设为 Thing.FrobberThingFrobber 更清楚地传达这种关系.在涉及泛型的许多情况下尤其如此。 List<T>.EnumeratorListEnumerator<T> 更清晰。此外,在某些涉及适配器之类的情况下,Name1<T1,T2,T3>.Name2<T4> 可能比 Name<T1,T2,T3,T4>` 更清晰地表达类型之间的关系。 还要注意,如果想要以指定一些参数但不指定其他参数的方式调用泛型方法,可以通过让静态类ClassName<T> 包含方法MethodName<U>(U param) 来实现。我知道没有更好的方法来指定方法的一些但不是全部的泛型类型。【参考方案2】:

您似乎认为 C# 中的嵌套类的行为与 Java 中的行为相同。换句话说,除非嵌套类被声明为静态,否则它将共享封闭类的实例。在 C# 中,情况并非如此。 C# 中没有这种东西——所有嵌套类都是隐式静态的。

这就是为什么你不能从嵌套类访问accountNumber,除非该字段被声明为静态的。 (因为嵌套类无法访问任何特定实例)C# 中这个问题的惯用解决方案是将封闭类的实例传递给嵌套类(可能是在实例化它时通过构造函数参数传递this)。

【讨论】:

你是说BankAccountSection 是隐式静态的 - 即它只能有静态成员?在给出的示例中,CreatePersonalAccount 未声明为 static 不,我是说它不是“实例类”(在 C# 中没有类似物,但在 Java 中确实存在)【参考方案3】:

首先,这不是嵌套类,它们只是一个文件中的两个类。

现在,即使它是一个嵌套类,这也可能是一个不使用嵌套类的例子。您绝对应该将您的逻辑与您的 GUI 逻辑分开。

我真的不认为你应该使用嵌套类,我认为它们很难维护,但我可能错了。如果我真的需要使用嵌套类,我可能只会在子类紧密相关时才这样做。

【讨论】:

【参考方案4】:

错误是因为您无法访问没有对象的非静态类的成员。 如果这样做,则必须将其声明为静态。

【讨论】:

以上是关于C#中的嵌套类的主要内容,如果未能解决你的问题,请参考以下文章

ElasticSearch 返回的嵌套属性未映射到 C# 类

《C#零基础入门之百识百例》(五十)嵌套类和嵌套方法 -- 汉诺塔游戏

我们啥时候在 C# 中使用嵌套类 [重复]

C# 嵌套类和继承

从嵌套类到包含类的 C# 成员访问 [重复]

c# 在类嵌套结构中引用非静态类成员