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;:これにより、すべてのBankオブジェクトでaccountNumber共有フィールドが作成され、目的全体が無効になります。そうしないでください。内部クラス内でオブジェクトのフィールドを設定する必要がある場合は、オブジェクトの参照を内部クラスに渡す必要があります。(これは、状況によってはそのような参照が自動的に使用可能になる Java とは異なります。) 特定のケースでは、内部クラスを取り除くだけです。BankBank

正当なユースケースの例

  • メソッド内に大きなアルゴリズムがあります。多くの小さなメソッドとインスタンス変数を使用して、このアルゴリズムを独自のクラスに抽出すると、可読性が向上することがわかります。アルゴリズムは非常に特殊で、おそらく他のクラスには役に立たないため、アルゴリズムを内部クラスに入れます。したがって、そのアルゴリズムでのみ使用されるインスタンス変数で外部クラスが乱雑になるのを回避できます。
  • リンクされたリストとして内部的に実装される List データ構造を作成します。リスト ノードを外部に公開しないため、ノードを内部クラスにします。

関連している:

于 2013-02-27T06:48:04.547 に答える
0

C# のネストされたクラスは、Java での動作と同じように動作すると考えているようです。つまり、ネストされたクラスが static として宣言されていない限り、それは外側のクラスのインスタンスを共有します。C# では、これは当てはまりません。C# にはそのようなものはありません。ネストされたクラスはすべて暗黙的に静的です。

accountNumberこれが、そのフィールドが静的であると宣言されていない限り、ネストされたクラスからアクセスできない理由です。(入れ子になったクラスは特定のインスタンスにアクセスできないため) C# でのこの問題に対する慣用的な解決策は、囲んでいるクラスのインスタンスを入れ子になったクラスに渡すことです (おそらくthis、インスタンス化するときにコンストラクター引数を介して渡すことによって)。

于 2013-02-27T06:45:17.473 に答える
0

まず、これは入れ子になったクラスではなく、1 つのファイルに 2 つのクラスがあるだけです。

ネストされたクラスであったとしても、これはおそらくネストされたクラスを使用しない場合の例です。ロジックを GUI ロジックから確実に分離する必要があります。

とにかく、ネストされたクラスを使用する必要があるとは本当に思いません。私の意見では、それらは維持するのが難しいですが、私は間違っているかもしれません。ネストされたクラスを本当に使用する必要がある場合は、おそらく、子クラスが密接に関連している場合にのみ使用します。

于 2013-02-27T06:45:56.663 に答える
0

エラーは、オブジェクトなしでは非静的クラスのメンバーにアクセスできないためです。その場合は、静的であると宣言する必要があります。

于 2013-02-27T06:49:30.383 に答える