“プライベート”修飾子は?
-
02-07-2019 - |
質問
「プライベート」を考慮するクラスメンバーのデフォルトのアクセス修飾子です。なぜキーワードが必要なのですか?
解決
コンパイラーではなく、あなた(および将来のメンテナー)のためです。
他のヒント
一定量の誤った情報がここにあります:
"デフォルトのアクセス修飾子はプライベートではなく内部です"
まあ、それはあなたが話していることに依存します。型のメンバーの場合、それはプライベートです。最上位型自体の場合、内部にあります。
" Privateは、型の methods のデフォルトに過ぎません"
いいえ、それは型のすべてのメンバーのデフォルトです-プロパティ、イベント、フィールド、演算子、コンストラクター、メソッド、ネストされた型、私が忘れてしまったもの。
"実際、クラスまたは構造体がアクセス修飾子で宣言されていない場合は、デフォルトで内部になります"
トップレベルタイプのみ。ネストされたタイプの場合、プライベートです。
1つの部分のプロパティアクセスを制限する以外は、デフォルトでは、基本的に常に「可能な限り制限」します。
個人的には、明示的かどうかの問題についてディザリングします。 「プロ」デフォルトを使用するのは、最も制限的なレベルよりも目に見えるものを作成している場所を強調表示するからです。 「プロ」明示的に指定することは、上記のルールを知らない人にとってより明白であり、あなたがそれについて少し考えたことを示しています。
Eric Lippertは明示的な形式を採用しており、私もそのように傾いています。
http://csharpindepth.com/ViewNote.aspx?NoteID=54 をご覧ください。これについてもう少し説明します。
明示性。デフォルトを使用せず、常に明示的に修飾子を追加します。
これは、デフォルトが「パッケージ」(C#の「内部」とほぼ同等)であるJavaの背景が原因である可能性があり、そのため、常に違いが気になりました。明示性が望ましいことがわかりました。
また、デフォルトでは明示的であるReSharperも使用しているため、バイアスを確認および強化するだけです:)
プライベート修飾子は意図を説明します。
プライベートメンバ変数は、クラス外での直接操作を目的としていません。 get / setアクセサは、変数に対して作成される場合とされない場合があります。
プライベートメソッドは、クラス外で使用するためのものではありません。これは内部機能専用です。または、デフォルトのコンストラクタをプライベートにして、値を渡さずにクラスの構築を防ぐこともできます。
private修飾子(およびそれに類するもの)は、自己文書化コードを記述する便利な方法です。
Jon Skeetの著書 C#In Depth で指摘されているように、C#には効果を得るためにprivateキーワードが必要な場所が1つあります。
メモリが正しく機能する場合、privateキーワードがプライベートスコープのプロパティゲッターまたはセッターを作成する唯一の方法です。その反対はプライベートアクセシビリティよりも優れています。例:
public bool CanAccessTheMissileCodes
{
get { return canAccessTheMissileCodes; }
private set { canAccessTheMissileCodes = value; }
}
プライベートキーワードはこれを実現するために必要です 。追加のプロパティアクセス可能性修飾子は範囲を狭めることができ、広げることはできないためです。 (そうでない場合は、プライベート(デフォルト)プロパティを作成し、パブリック修飾子を追加できる可能性があります。)
privateは型の methods のデフォルトのみですが、private修飾子は他の場所で使用されます。
C#言語仕様3.0(msdn)セクション3.5から。 1
メンバー宣言が行われるコンテキストに応じて、宣言された特定の種類のアクセシビリティのみが許可されます。さらに、メンバー宣言にアクセス修飾子が含まれていない場合、宣言が行われるコンテキストによって、宣言されているデフォルトのアクセシビリティが決定されます。
- ネームスペースには、暗黙的にパブリック宣言されたアクセシビリティがあります。名前空間宣言ではアクセス修飾子を使用できません。
- コンパイル単位または名前空間で宣言された型は、パブリックまたは内部で宣言されたアクセシビリティとデフォルトを持つことができます 内部宣言されたアクセシビリティへ。
- クラスメンバーは、5種類の宣言されたアクセシビリティのいずれかを持つことができ、デフォルトではプライベート宣言されたアクセシビリティになります。 (クラスのメンバーとして宣言された型は、5種類の宣言されたアクセシビリティのいずれかを持つことができますが、名前空間のメンバーとして宣言された型は、パブリックまたは内部宣言されたアクセシビリティのみを持つことができます。)
- 構造体は暗黙的にシールされるため、Structメンバはパブリック、内部、またはプライベートの宣言されたアクセシビリティを持ち、デフォルトでプライベートの宣言されたアクセシビリティになります。構造体に導入された(つまり、その構造体によって継承されていない)構造体メンバーは、保護されたまたは保護された内部宣言されたアクセシビリティを持つことができません。 (構造体のメンバーとして宣言された型は、パブリック、内部、またはプライベートの宣言されたアクセシビリティを持つことができますが、名前空間のメンバーとして宣言された型は、パブリックまたは内部の宣言されたアクセシビリティのみを持つことができます。)
- インターフェイスメンバーは、暗黙的にパブリック宣言されたアクセシビリティを持っています。インターフェイスメンバ宣言ではアクセス修飾子は許可されません。
- 列挙型メンバーは、暗黙的に公開宣言されたアクセシビリティを持っています。列挙メンバー宣言ではアクセス修飾子は許可されません。
完全を期すため。また、実際には、メソッドのアクセス修飾子についてコードで明示的にすることを好む人もいます。
対称性と、すべてが明示的であることが好きなコーディングスタイルに準拠するために(個人的には気に入っています...)
privateを使用すると、意図を明示的に通知し、コードをサポートする他のユーザーにヒントを残します;)
一部のコーディングスタイルでは、すべての" public"最初にアイテム、次に「プライベート」アイテム。 「プライベート」なしキーワード、あなたはその方法でそれを行うことができませんでした。
更新:" c#"に気付きませんでしたこれにタグを付けて、私の答えがC#よりもC ++に適用されるようにします。
私は通常プライベートを省きますが、コードを並べるのに便利だと思います:
private int x;
public string y;
protected float z;
VS:
int x;
public string y;
protected float z;
ロバートポールソンが答えたように、<コード> private 修飾子は、メンバーだけでなく、型でも使用されます。タイプのデフォルトは internal
であるため、これは重要になります。 InternalsVisibleToAttribute 。
実際には、クラスまたは構造体がアクセス修飾子で宣言されていない場合、デフォルトで内部になります。
したがって、プライベートにする場合はプライベートを使用します。