「private」がクラスMembersのデフォルトのアクセス修飾子であることを考えると、なぜキーワードが必要なのですか?
13 に答える
ここには、ある程度の誤報があります。
「デフォルトのアクセス修飾子はプライベートではなく内部です」
まあ、それはあなたが話していることによります。タイプのメンバーの場合、それは非公開です。トップレベルの型自体の場合、それは内部です。
「プライベートは、型のメソッドのデフォルトのみです」
いいえ、それは型のすべてのメンバーのデフォルトです - プロパティ、イベント、フィールド、演算子、コンストラクター、メソッド、ネストされた型、および私が忘れていたその他のもの。
「実際には、クラスまたは構造体がアクセス修飾子で宣言されていない場合、デフォルトで internal になります」
トップレベルの型のみ。ネストされた型の場合、それは非公開です。
一方の部分ではプロパティ アクセスを制限し、もう一方の部分では制限しない場合を除いて、デフォルトは基本的に常に「可能な限り制限的」です。
個人的には、明示的にするかどうかという問題について悩んでいます。デフォルトを使用することの「長所」は、最も制限的なレベルよりも目に見えるものをどこでも強調表示することです。明示的に指定することの「長所」は、上記のルールを知らない人にとってはより明白であり、それについて少し考えたことを示しています。
Eric Lippert は明示的な形式を使用しており、私もその方法に傾倒し始めています。
詳細については、 http://csharpindepth.com/viewnote.aspx?noteid=54を参照してください。
コンパイラではなく、あなた(そして将来のメンテナ)のためです。
明示性。デフォルトを使用することはなく、常に明示的に修飾子を追加します。
これは、デフォルトが「パッケージ」(C#の「内部」とほぼ同等)であったJavaのバックグラウンドが原因である可能性があり、その違いが常に気になりました。明示性が望ましいと思いました。
また、デフォルトで明示的に設定されているReSharperも使用しているため、バイアスを確認して強化するだけです:)
private 修飾子は意図を説明します。
プライベート メンバー変数は、クラス外で直接操作するためのものではありません。get/set アクセサーは、変数に対して作成される場合と作成されない場合があります。
プライベート メソッドは、クラス外で使用するためのものではありません。これは、内部機能専用の場合があります。または、デフォルトのコンストラクターをプライベートにして、値を渡さずにクラスを構築できないようにすることもできます。
private 修飾子 (および同様の他の修飾子) は、自己文書化コードを記述する便利な方法です。
Jon Skeet が著書C# In Depthで指摘したように、C# には効果を得るために private キーワードが必要な場所が 1 つあります。
私の記憶が正しければ、private キーワードは、プライベート スコープのプロパティ getter または setter を作成する唯一の方法です。例:
public bool CanAccessTheMissileCodes
{
get { return canAccessTheMissileCodes; }
private set { canAccessTheMissileCodes = value; }
}
これを実現するには、private キーワードが必要です。これは、プロパティのアクセシビリティ修飾子を追加すると、範囲を広げることはできず、範囲を狭めることができるためです。(それ以外の場合は、プライベート (デフォルトで) プロパティを作成してから、パブリック修飾子を追加できた可能性があります。)
Private は型のメソッドのデフォルトのみですが、private 修飾子は他の場所で使用されます。
C# 言語仕様 3.0 (msdn)セクション 3.5.1から
メンバー宣言が行われるコンテキストに応じて、特定の種類の宣言されたアクセシビリティのみが許可されます。さらに、メンバー宣言にアクセス修飾子が含まれていない場合、宣言が行われるコンテキストによって、既定の宣言されたアクセシビリティが決まります。
- 名前空間は暗黙的に public 宣言されたアクセシビリティを持っています。名前空間宣言では、アクセス修飾子は許可されません。
- コンパイル ユニットまたは名前空間で宣言された型は、public または internal の宣言されたアクセシビリティを持ち、内部で宣言されたアクセシビリティにデフォルト設定されます。
- クラス メンバーは、5 種類の宣言されたアクセシビリティのいずれかを持つことができ、デフォルトで非公開の宣言されたアクセシビリティに設定されます。(クラスのメンバーとして宣言された型は、5 種類の宣言されたアクセシビリティのいずれかを持つことができますが、名前空間のメンバーとして宣言された型は、public または internal の宣言されたアクセシビリティのみを持つことができることに注意してください。)
- 構造体メンバーは、パブリック、内部、またはプライベートに宣言されたアクセシビリティを持つことができ、構造体は暗黙的にシールされているため、デフォルトでプライベートに宣言されたアクセシビリティに設定されます。構造体で導入された (つまり、その構造体によって継承されていない) 構造体メンバーは、内部で宣言されたアクセシビリティを保護または保護することはできません。(構造体のメンバーとして宣言された型は、パブリック、内部、またはプライベートに宣言されたアクセシビリティを持つことができますが、名前空間のメンバーとして宣言された型は、パブリックまたは内部に宣言されたアクセシビリティのみを持つことができることに注意してください。)
- インターフェイス メンバーは暗黙的に public 宣言されたアクセシビリティを持っています。インターフェイス メンバーの宣言では、アクセス修飾子は許可されません。
- 列挙型のメンバーは、パブリックに宣言されたアクセシビリティを暗黙的に持っています。列挙メンバーの宣言では、アクセス修飾子は許可されません。
コンプリート用。また、実際には、メソッドのアクセス修飾子についてコード内で明示することを好む人もいます。
対称性のために、そしてすべてが明示的であることが好きなコーディングスタイルに準拠するために(個人的に私はそれが好きです...)
私は通常、private を省略しますが、コードを並べるのに便利だと思います。
private int x;
public string y;
protected float z;
VS:
int x;
public string y;
protected float z;
Robert Paulsonが彼の回答で述べたように、修飾子private
はメンバーだけでなく、型にも使用されます。InternalsVisibleToAttributeを使用すると、タイプのデフォルトinternal
が意図せずリークする可能性があるため、これは重要になります。
一部のコーディング スタイルでは、すべての「パブリック」アイテムを最初に配置し、その後に「プライベート」アイテムを配置することを推奨しています。「private」キーワードがなければ、その方法はできません。
更新:「c#」タグに気付かなかったので、私の答えは C# よりも C++ に適用されます。
private を明示的に使用すると、あなたの意図が明確に示され、あなたのコードをサポートしてくれる他の人に手がかりが残ります;)
実際には、クラスまたは構造体がアクセス修飾子で宣言されていない場合、デフォルトで internal になります。
したがって、非公開にしたい場合は、private を使用してください。