1

Delegate名前空間スコープ内で直接宣言するよりも、クラススコープ内で型を宣言することの長所と短所は何ですか?私は次の2つを意味します-

namespace MyNamespace
{
    public delegate string NamespaceScopeDelegate(int x, int y);

    public class ClassX
    {
        //class members
    }
}  

と、

namespace YourNamespace
{
    public class ClassA
    {
        public delegate string ClassScopeDelegate(int x, int y);

        //...
        //other class members
    }
}  

後者のシナリオを使用するには、どのような実用的なシナリオが必要ですか?私はそれが正確にどこに適切であるかを意味しますか?

編集 :

最初のケースでは、デリゲートタイプをインスタンス化する必要があるときはいつでも、次のように実行できます-

var delegateInstance = new NamespaceScopeDelegate(MethodToPoint);  

しかし、2番目のケースでは、囲んでいる型名を-として使用する必要があります。

var delegateInstance = new ClassA.ClassScopeDelegate(MethodToPoint);  

なぜ私はそれをしたいのですか?2番目のケースは、私がまだ気付いていない種類のカプセル化を提供しますか?この種のアクセシビリティを必要とする特別なシナリオはありますか?

4

3 に答える 3

1

現在の例では、唯一の違いは、2番目の例では名前空間が乱雑にならないことです。最初に宣言されているクラスを参照する必要があります。これを使用して、デリゲートがクラスと密接な関係にあり、ほとんどの場合、デリゲートだけで使用されていることを明確にすることができます。

次のことも可能です(内部またはプライベート)。

namespace YourNamespace
{
    public class ClassA
    {
        internal/private delegate string ClassScopeDelegate(int x, int y);

        //...
        //other class members
    }
}

内部にすることで、同じアセンブリのみがアクセスでき、名前空間が乱雑になることはありません。プライベートにすることで、クラス自体のみがデリゲート宣言にアクセスできます。

于 2012-09-19T10:45:24.303 に答える
0

名前空間は、クラス/デリゲートの優れた命名ツールにすぎないことを理解する必要があります。

このコードを例にとってみましょう。

namespace YourNamespace
{
    public class ClassA
    {
    }
}

。という名前のクラスを生成しYourNamespace.ClassAます。実際の名前空間はありません。名前が点線で表記されているクラスだけです。

クラス内で定義されたデリゲートについても同じことが言えます。

重要なのは、コードをどのように整理するかです。

そのような単純な。

于 2012-09-21T03:11:23.627 に答える
0

後者のシナリオを使用するには、どのような実用的なシナリオが必要ですか?

代表者の場合、おそらくありません。

コメントですでに述べたネストされたタイプから:

型が宣言型の外部で参照される可能性がある場合は、ネストされた型を使用しないでください。一般的なシナリオでは、ネストされた型の変数の宣言とオブジェクトのインスタンス化は必要ありません。たとえば、クラスで定義されたイベントを処理するイベントハンドラデリゲートは、クラスにネストしないでください。

于 2017-12-19T10:27:49.803 に答える