Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/314.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# C语言中的嵌套类#_C#_Nested Class - Fatal编程技术网

C# C语言中的嵌套类#

C# C语言中的嵌套类#,c#,nested-class,C#,Nested Class,我正在研究c#中的嵌套类。在阅读了许多文档和目瞪口呆之后,我仍然不清楚何时使用嵌套类。但据我所知,我做了一个小样本程序。我正在下面粘贴我的代码。这个嵌套类程序是否以正确的逻辑实现。嵌套类实际用于什么?。我在这个节目中也有疑问,我在节目中明确了这个疑问。请帮帮我 public partial class Form1 : Form { public Form1() { InitializeComponent(); Bank bankObj = new

我正在研究c#中的嵌套类。在阅读了许多文档和目瞪口呆之后,我仍然不清楚何时使用嵌套类。但据我所知,我做了一个小样本程序。我正在下面粘贴我的代码。这个嵌套类程序是否以正确的逻辑实现。嵌套类实际用于什么?。我在这个节目中也有疑问,我在节目中明确了这个疑问。请帮帮我

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

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


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

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

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


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

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

您的代码

在您的例子中,嵌套类
BankAccountSection
实际上并不有用,因为它本身没有状态
CreatePersonalAccount
也可能只是外部类的一个方法

关于
静态int帐号:这将使
accountNumber
成为所有银行对象的共享字段,这将破坏整个目的。不要那样做。如果确实需要在内部类中设置
Bank
对象的字段,则需要将
Bank
对象的引用传递给内部类。(这与Java不同,Java在某些情况下自动提供这样的引用。)在您的特定情况下,只需去掉内部类

合法用例示例

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


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

      您的代码根本不显示嵌套类。它有两个独立的顶级类。@Jon,
      BankAccountSection
      嵌套在
      Bank
      Imo/ime中嵌套类没有多大用处您是说
      BankAccountSection
      是隐式静态的,即它只能有静态成员吗?在给出的示例中,
      CreatePersonalAccount
      没有声明为
      static
      。不,我是说它不是一个“实例类”(在C#中没有模拟,但在Java中确实存在),我建议如果一个
      东西
      定义了一个类型,它的实例将存在以作用于特定实例上,将类型设为
      对象。Frobber
      ThingFrobber
      更清楚地表达了这种关系。这在涉及泛型的许多情况下尤其如此<代码>列表。枚举数
列表分子
更清晰。此外,在某些涉及适配器的情况下,
Name1.Name2
可以比
Name`更清晰地表达类型之间的关系。还要注意,如果希望以指定某些参数而不是其他参数的方式调用泛型方法,可以通过使静态类
ClassName
包含方法
MethodName(U参数)
来实现这一点。我知道没有更好的方法可以允许指定方法的某些泛型类型,但不是所有泛型类型。