理由の場合はご利用入れ子のクラスです。います。はいけないのか?
質問
に Kathleen Dollardの最近のブログ, たこともしない理由を利用入れ子のクラスです。います。しかし、彼女はまた、我がFxCopないようにネストした。私はこの文書FxCop規則な愚かないが背後にあるという立場でしていきたいティへ簡単にアクセスできます。
解決
使用入れ子のクラスのクラスで営巣するだけで使用し、囲むクラスです。例えば、入れ子のクラスで書くように(簡体字)はこちら:
public class SortedMap {
private class TreeNode {
TreeNode left;
TreeNode right;
}
}
できる完全な定義のクラスを一つの場所を継続してご利用いただけるジャンプを通PIMPLフープを定義する方法クラスの作品は、外の世界は必要ありませんが見もの。
場合にはTreeNodeのクラスが外部きしているすべての分野 public
やっ get/set
方法で利用します。外の世界が別のクラスの汚染を行頭に付けた.
他のヒント
を利用する理由入れ子のクラス?がないやむを得ない場合に利用入れ子のクラスが、そのうちの:
- うものですし、そうやって論理的にグループ化されたクラスのみにする"にチェックを入れてください。
- そのために、この封止.
- 入れ子のクラスで読みやすくするために、保守性のコードです。
論理的グループのクラスがクラスを一つだけ他のクラスは、その論理的な埋め込みでスク以外のリスクにつき意の二つを一つにした。ネストの"ヘルパークラス"によっておりパッケージをより効率化されました。
増封入—検討のトップレベルのクラス、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();
}
}
では、使用法に応じて異なります。ないもんがっ用入れ子のクラスが使用個入れ子のクラスのすべてます。民間の入れ子のクラスに使用できるサブオブジェクトで使用のみを目的とした内会はなかったようである。例えば、い場合はハッシュテーブルクラスを含むプライベートエントリのオブジェクトでデータを社内だけます。
場合にクラスは、するために設計された、呼び出し側(外部)、一般的のようで別に単体のクラスです。
また、その他の理由がありそれを考えることができるだけで使用するのではなく入れ子のクラスが、実は公共の入れ子のクラス.お仕事の方に複数の汎用クラスが同じ汎用型のパラメータの能力を宣言する汎用的な名前空間に極めて有効である。残念ながら、.ネット(または少なくとも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
としての int
や 5.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);
使用メソッドは、入れ子の汎用型で伝える代表者に適用する部品全体のタイプ。
の入れ子のクラスに使用できる援
- 分類のデータ
- 場の理論のクラスが複雑で、きってしまったような感覚を必要と配下の管理オブジェクトに対するクラス
- きの状態の存在のクラスの完全に囲むクラス
私はよく利用入れ子のクラスを実装を隠します。 例からエリック-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);
}
}
}