理由の場合はご利用入れ子のクラスです。います。はいけないのか?

StackOverflow https://stackoverflow.com/questions/48872

  •  09-06-2019
  •  | 
  •  

質問

Kathleen Dollardの最近のブログ, たこともしない理由を利用入れ子のクラスです。います。しかし、彼女はまた、我がFxCopないようにネストした。私はこの文書FxCop規則な愚かないが背後にあるという立場でしていきたいティへ簡単にアクセスできます。

役に立ちましたか?

解決

使用入れ子のクラスのクラスで営巣するだけで使用し、囲むクラスです。例えば、入れ子のクラスで書くように(簡体字)はこちら:

public class SortedMap {
    private class TreeNode {
        TreeNode left;
        TreeNode right;
    }
}

できる完全な定義のクラスを一つの場所を継続してご利用いただけるジャンプを通PIMPLフープを定義する方法クラスの作品は、外の世界は必要ありませんが見もの。

場合にはTreeNodeのクラスが外部きしているすべての分野 public やっ get/set 方法で利用します。外の世界が別のクラスの汚染を行頭に付けた.

他のヒント

からのSunのJavaチュートリアル:

を利用する理由入れ子のクラス?がないやむを得ない場合に利用入れ子のクラスが、そのうちの:

  • うものですし、そうやって論理的にグループ化されたクラスのみにする"にチェックを入れてください。
  • そのために、この封止.
  • 入れ子のクラスで読みやすくするために、保守性のコードです。

論理的グループのクラスがクラスを一つだけ他のクラスは、その論理的な埋め込みでスク以外のリスクにつき意の二つを一つにした。ネストの"ヘルパークラス"によっておりパッケージをより効率化されました。

増封入—検討のトップレベルのクラス、AとBのニーズにアクセスすることを宣言します。隠れたBクラス内のクラスは、メンバーで宣言された個人およびBにアクセスできます。また、Bそのもので隠すことができ、外部からの世界です。 <-この中になっている、いわC#'sの実施入れ子のクラスは、このみ適用されるJava.

読みやすくするために、コード入れ子の少人数クラス内でトップレベルの授業場所のコードに近い場所で利用されています。

完全にネスレッドセーシングルトンパターン

public sealed class Singleton
{
    Singleton()
    {
    }

    public static Singleton Instance
    {
        get
        {
            return Nested.instance;
        }
    }

    class Nested
    {
        // Explicit static constructor to tell C# compiler
        // not to mark type as beforefieldinit
        static Nested()
        {
        }

        internal static readonly Singleton instance = new Singleton();
    }
}

ソース: http://www.yoda.arachsys.com/csharp/singleton.html

では、使用法に応じて異なります。ないもんがっ用入れ子のクラスが使用個入れ子のクラスのすべてます。民間の入れ子のクラスに使用できるサブオブジェクトで使用のみを目的とした内会はなかったようである。例えば、い場合はハッシュテーブルクラスを含むプライベートエントリのオブジェクトでデータを社内だけます。

場合にクラスは、するために設計された、呼び出し側(外部)、一般的のようで別に単体のクラスです。

また、その他の理由がありそれを考えることができるだけで使用するのではなく入れ子のクラスが、実は公共の入れ子のクラス.お仕事の方に複数の汎用クラスが同じ汎用型のパラメータの能力を宣言する汎用的な名前空間に極めて有効である。残念ながら、.ネット(または少なくともC#)をサポートしていないアジェネリック薬の名前空間その実現のために、同じ目標を利用するとともに、汎用のクラスを実現するものではなく、"目標です。以下の例の授業に関連した論理体

public  class       BaseDataObject
                    <
                        tDataObject, 
                        tDataObjectList, 
                        tBusiness, 
                        tDataAccess
                    >
        where       tDataObject     : BaseDataObject<tDataObject, tDataObjectList, tBusiness, tDataAccess>
        where       tDataObjectList : BaseDataObjectList<tDataObject, tDataObjectList, tBusiness, tDataAccess>, new()
        where       tBusiness       : IBaseBusiness<tDataObject, tDataObjectList, tBusiness, tDataAccess>
        where       tDataAccess     : IBaseDataAccess<tDataObject, tDataObjectList, tBusiness, tDataAccess>
{
}

public  class       BaseDataObjectList
                    <
                        tDataObject, 
                        tDataObjectList, 
                        tBusiness, 
                        tDataAccess
                    >
:   
                    CollectionBase<tDataObject>
        where       tDataObject     : BaseDataObject<tDataObject, tDataObjectList, tBusiness, tDataAccess>
        where       tDataObjectList : BaseDataObjectList<tDataObject, tDataObjectList, tBusiness, tDataAccess>, new()
        where       tBusiness       : IBaseBusiness<tDataObject, tDataObjectList, tBusiness, tDataAccess>
        where       tDataAccess     : IBaseDataAccess<tDataObject, tDataObjectList, tBusiness, tDataAccess>
{
}

public  interface   IBaseBusiness
                    <
                        tDataObject, 
                        tDataObjectList, 
                        tBusiness, 
                        tDataAccess
                    >
        where       tDataObject     : BaseDataObject<tDataObject, tDataObjectList, tBusiness, tDataAccess>
        where       tDataObjectList : BaseDataObjectList<tDataObject, tDataObjectList, tBusiness, tDataAccess>, new()
        where       tBusiness       : IBaseBusiness<tDataObject, tDataObjectList, tBusiness, tDataAccess>
        where       tDataAccess     : IBaseDataAccess<tDataObject, tDataObjectList, tBusiness, tDataAccess>
{
}

public  interface   IBaseDataAccess
                    <
                        tDataObject, 
                        tDataObjectList, 
                        tBusiness, 
                        tDataAccess
                    >
        where       tDataObject     : BaseDataObject<tDataObject, tDataObjectList, tBusiness, tDataAccess>
        where       tDataObjectList : BaseDataObjectList<tDataObject, tDataObjectList, tBusiness, tDataAccess>, new()
        where       tBusiness       : IBaseBusiness<tDataObject, tDataObjectList, tBusiness, tDataAccess>
        where       tDataAccess     : IBaseDataAccess<tDataObject, tDataObjectList, tBusiness, tDataAccess>
{
}

きの簡素化のシグニチャーのこれらのクラスによる一般名前空間(されて入れ子のクラス):

public
partial class   Entity
                <
                    tDataObject, 
                    tDataObjectList, 
                    tBusiness, 
                    tDataAccess
                >
        where   tDataObject     : Entity<tDataObject, tDataObjectList, tBusiness, tDataAccess>.BaseDataObject
        where   tDataObjectList : Entity<tDataObject, tDataObjectList, tBusiness, tDataAccess>.BaseDataObjectList, new()
        where   tBusiness       : Entity<tDataObject, tDataObjectList, tBusiness, tDataAccess>.IBaseBusiness
        where   tDataAccess     : Entity<tDataObject, tDataObjectList, tBusiness, tDataAccess>.IBaseDataAccess
{

    public  class       BaseDataObject {}

    public  class       BaseDataObjectList : CollectionBase<tDataObject> {}

    public  interface   IBaseBusiness {}

    public  interface   IBaseDataAccess {}

}

そして、一部の授業とErik van Brakelたコメントできる別のクラス別の入れ子ファイルです。私の使用をお勧めしVisual Studioの延長のようにNestInへの支援入れ子の部分クラスファイルです。この"名前空間"がクラスファイルを使用することもに編入れ子のクラスファイルフォルダのようです。

例えば:

団体をいう。cs

public
partial class   Entity
                <
                    tDataObject, 
                    tDataObjectList, 
                    tBusiness, 
                    tDataAccess
                >
        where   tDataObject     : Entity<tDataObject, tDataObjectList, tBusiness, tDataAccess>.BaseDataObject
        where   tDataObjectList : Entity<tDataObject, tDataObjectList, tBusiness, tDataAccess>.BaseDataObjectList, new()
        where   tBusiness       : Entity<tDataObject, tDataObjectList, tBusiness, tDataAccess>.IBaseBusiness
        where   tDataAccess     : Entity<tDataObject, tDataObjectList, tBusiness, tDataAccess>.IBaseDataAccess
{
}

団体をいう。BaseDataObject.cs

partial class   Entity<tDataObject, tDataObjectList, tBusiness, tDataAccess>
{

    public  class   BaseDataObject
    {

        public  DataTimeOffset  CreatedDateTime     { get; set; }
        public  Guid            CreatedById         { get; set; }
        public  Guid            Id                  { get; set; }
        public  DataTimeOffset  LastUpdateDateTime  { get; set; }
        public  Guid            LastUpdatedById     { get; set; }

        public
        static
        implicit    operator    tDataObjectList(DataObject dataObject)
        {
            var returnList  = new tDataObjectList();
            returnList.Add((tDataObject) this);
            return returnList;
        }

    }

}

団体をいう。BaseDataObjectList.cs

partial class   Entity<tDataObject, tDataObjectList, tBusiness, tDataAccess>
{

    public  class   BaseDataObjectList : CollectionBase<tDataObject>
    {

        public  tDataObjectList ShallowClone() 
        {
            var returnList  = new tDataObjectList();
            returnList.AddRange(this);
            return returnList;
        }

    }

}

団体をいう。IBaseBusiness.cs

partial class   Entity<tDataObject, tDataObjectList, tBusiness, tDataAccess>
{

    public  interface   IBaseBusiness
    {
        tDataObjectList Load();
        void            Delete();
        void            Save(tDataObjectList data);
    }

}

団体をいう。IBaseDataAccess.cs

partial class   Entity<tDataObject, tDataObjectList, tBusiness, tDataAccess>
{

    public  interface   IBaseDataAccess
    {
        tDataObjectList Load();
        void            Delete();
        void            Save(tDataObjectList data);
    }

}

のファイルをvisual studioソリューションエクスプローラが組織など:

Entity.cs
+   Entity.BaseDataObject.cs
+   Entity.BaseDataObjectList.cs
+   Entity.IBaseBusiness.cs
+   Entity.IBaseDataAccess.cs

い実施の名前空間は以下のような:

ユーザーです。cs

public
partial class   User
:
                Entity
                <
                    User.DataObject, 
                    User.DataObjectList, 
                    User.IBusiness, 
                    User.IDataAccess
                >
{
}

ユーザーです。DataObject.cs

partial class   User
{

    public  class   DataObject : BaseDataObject 
    {
        public  string  UserName            { get; set; }
        public  byte[]  PasswordHash        { get; set; }
        public  bool    AccountIsEnabled    { get; set; }
    }

}

ユーザーです。DataObjectList.cs

partial class   User
{

    public  class   DataObjectList : BaseDataObjectList {}

}

ユーザーです。IBusiness.cs

partial class   User
{

    public  interface   IBusiness : IBaseBusiness {}

}

ユーザーです。IDataAccess.cs

partial class   User
{

    public  interface   IDataAccess : IBaseDataAccess {}

}

のファイルからのソリューションエクスプローラとして

User.cs
+   User.DataObject.cs
+   User.DataObjectList.cs
+   User.IBusiness.cs
+   User.IDataAccess.cs

上記の簡単な例を用い、外部クラスとしての名前空間.私は内蔵の"ジェネリックの名前空間"を含む9以上の型パラメータです。持ちタイプのパラメータの同期の四種類すべてに必要な知型のパラメータの面倒だったが、新しいパラメータとします。ジェネリックの名前空間と、そのコードで管理できやすことはないですね。

理解していKatheleenの権利、途に使うことを提案する入れ子のクラスを書くことができるSomeEntity.回収の代わりにEntityCollection< SomeEntity>.私の意見で問題にならないように、一文字を入力すきだと思うのだが現実の世界募集してい違いが実装が必要となりますので作り別々のクラスをくれました。と思いる利用クラス名を制限その他のクラスの範囲は良い方法がありました。で汚染を行頭に付け、強化依存関係はます。名前空間を標準をどのように制御すべきかという授業です。しかしその利用入れ子のクラスのような@hazzenコメントが可能になりますがトンの入れ子のクラスである看板のデザイン。

他利用いた入れ子のクラスの偏析の汎用タイプ。たとえば、たいてい一般的な家族の静的な授業ができる手法と各種パラメータは、値のパラメータを生かすための代表者の少ないパラメータ。例えば、希望についてのstaticメソッドできるか Action<string, int, double> とり String<string, int> る電話、提供行動を通過3.5としての double;について静的な方法できる、 Action<string, int, double> とになり Action<string>, パ 7 としての int5.3 としての double.を用いた入れ子のクラスは、このメソッド呼び出しするようなもの:

MakeDelegate<string,int>.WithParams<double>(theDelegate, 3.5);
MakeDelegate<string>.WithParams<int,double>(theDelegate, 7, 5.3);

または、後者の種類毎に表情を推論できる場合も前のものでない:

MakeDelegate<string,int>.WithParams(theDelegate, 3.5);
MakeDelegate<string>.WithParams(theDelegate, 7, 5.3);

使用メソッドは、入れ子の汎用型で伝える代表者に適用する部品全体のタイプ。

の入れ子のクラスに使用できる援

  1. 分類のデータ
  2. 場の理論のクラスが複雑で、きってしまったような感覚を必要と配下の管理オブジェクトに対するクラス
  3. きの状態の存在のクラスの完全に囲むクラス

私はよく利用入れ子のクラスを実装を隠します。 例からエリック-Lippertの回答はこちら

abstract public class BankAccount
{
    private BankAccount() { }
    // Now no one else can extend BankAccount because a derived class
    // must be able to call a constructor, but all the constructors are
    // private!
    private sealed class ChequingAccount : BankAccount { ... }
    public static BankAccount MakeChequingAccount() { return new ChequingAccount(); }
    private sealed class SavingsAccount : BankAccount { ... }
}

このパターンなものジェネリック医薬品.この質問 二涼しい例です。なので私は書く

Equality<Person>.CreateComparer(p => p.Id);

の代わりに

new EqualityComparer<Person, int>(p => p.Id);

もできる汎用のリスト Equality<Person> がない EqualityComparer<Person, int>

var l = new List<Equality<Person>> 
        { 
         Equality<Person>.CreateComparer(p => p.Id),
         Equality<Person>.CreateComparer(p => p.Name) 
        }

場として

var l = new List<EqualityComparer<Person, ??>>> 
        { 
         new EqualityComparer<Person, int>>(p => p.Id),
         new EqualityComparer<Person, string>>(p => p.Name) 
        }

はできません。この入れ子のクラスを継承からの親クラスです。

別の例と同じ自然に隠実施)を行いたい場合にクラスのメンバー(分野の特性等)のみがアクセスのための単一のクラス:

public class Outer 
{
   class Inner //private class
   {
       public int Field; //public field
   }

   static inner = new Inner { Field = -1 }; // Field is accessible here, but in no other class
}

として nawfal 上記の実施概要工場でのパターンを用いることを可能axtended達成 クラスのクラスターのパターン に基づく抽象工場パターンです。

う巣例外ならではのシングルのクラスが打ち出されている。-ているものとまったくない投げられたその他の場所です。

例えば:

public class MyClass
{
    void DoStuff()
    {
        if (!someArbitraryCondition)
        {
            // This is the only class from which OhNoException is thrown
            throw new OhNoException(
                "Oh no! Some arbitrary condition was not satisfied!");
        }
        // Do other stuff
    }

    public class OhNoException : Exception
    {
        // Constructors calling base()
    }
}

これによってプロジェクトを維持ファイルの整理整頓となるマルチステークホルダーモデル百stubby少しの例外。

ことに留意することが必要なテストメソッドは、入れ子のクラスです。であれば、できませんを検査するのです。

すで内部も 併せて、 InternalsVisibleTo 属性.しかし、これと同じ作り、民間分野に内部のみを試験の目的は、私の悪い自己資料。

いたいということのみを実施民間入れ子のクラスを伴う低複雑になります。

ありこの場合:

class Join_Operator
{

    class Departamento
    {
        public int idDepto { get; set; }
        public string nombreDepto { get; set; }
    }

    class Empleado
    {
        public int idDepto { get; set; }
        public string nombreEmpleado { get; set; }
    }

    public void JoinTables()
    {
        List<Departamento> departamentos = new List<Departamento>();
        departamentos.Add(new Departamento { idDepto = 1, nombreDepto = "Arquitectura" });
        departamentos.Add(new Departamento { idDepto = 2, nombreDepto = "Programación" });

        List<Empleado> empleados = new List<Empleado>();
        empleados.Add(new Empleado { idDepto = 1, nombreEmpleado = "John Doe." });
        empleados.Add(new Empleado { idDepto = 2, nombreEmpleado = "Jim Bell" });

        var joinList = (from e in empleados
                        join d in departamentos on
                        e.idDepto equals d.idDepto
                        select new
                        {
                            nombreEmpleado = e.nombreEmpleado,
                            nombreDepto = d.nombreDepto
                        });
        foreach (var dato in joinList)
        {
            Console.WriteLine("{0} es empleado del departamento de {1}", dato.nombreEmpleado, dato.nombreDepto);
        }
    }
}
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top