3

我正在尝试研究 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());
    }
}
4

4 回答 4

7

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

你的代码

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

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

合法用例示例

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

有关的:

于 2013-02-27T06:48:04.547 回答
0

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

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

于 2013-02-27T06:45:17.473 回答
0

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

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

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

于 2013-02-27T06:45:56.663 回答
0

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

于 2013-02-27T06:49:30.383 回答