C#中的嵌套类

时间:2013-02-27 06:40:54

标签: c# nested-class

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

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());
    }
}

4 个答案:

答案 0 :(得分:7)

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

您的代码

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

关于static int accountNumber;:这会使accountNumber成为所有 Bank对象的共享字段,这会破坏整个目的。不要那样做。如果确实需要在内部类中设置Bank对象的字段,则需要将Bank对象的引用传递给内部类。 (这与Java不同,在某些情况下,这种引用可以自动使用。)在您的特定情况下,只需删除内部类。

合法用例示例

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

相关:

答案 1 :(得分:0)

您似乎认为C#中的嵌套类表现了它们在Java中的作用。换句话说,除非将嵌套类声明为静态,否则它将共享封闭类的实例。在C#中,情况并非如此。

中没有C#中的那种东西 - 所有嵌套类都是隐式的。

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

答案 2 :(得分:0)

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

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

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

答案 3 :(得分:0)

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