C#で「プライベート」キーワードを記述する理由は何ですか?


109

私の知る限りでは、privateデフォルトでどこでも C#では(私は書いていない場合つまりpublicprotectedinternal、など、それはなりますprivateデフォルトでは)。(間違いがあったら訂正してください。)

それで、そのキーワードを書く理由は何ですか、またはなぜそれがメンバーのために存在するのですか?

たとえば、イベントハンドラーが自動生成されると、次のようになります。

private void RatTrap_MouseEnter(object sender, CheeseEventArgs e)
{

}

しかし、それが暗黙的でデフォルトであるのに、なぜそれはプライベートでさえ書くのですか?初心者の開発者(C#のデフォルトであることを知らない人)がプライベートであることを知っているだけですか?それともコンパイラに違いはありますか?

また、「プライベート」(単独)でメンバーのアクセシビリティ変わるケースはありますか?


18
ただし、IIRC、「トップレベル」タイプはinternalデフォルトで使用されます。
ジェフメルカード

4
示されているように、すべてのデフォルトはプライベートではありません。一般的な経験則として、明示的にすることをお勧めします。
James Michael Hare


すべてのデフォルトは「できるだけプライベート」です。明らかに、ネストされていないクラスをプライベートにすることはできません。クラスをインスタンス化したり使用したりすることはできません。ただし、メンバーはデフォルトでプライベートであり、ネストされたクラスはデフォルトでプライベートです。C#のすべてのものには、デフォルトで、最も制限された可視性レベルがあります。
Ryan Lundy

回答:


171

私の知る限り、C#ではどこでもプライベートがデフォルトです(つまり、パブリック、プロテクト、内部などを記述しないと、デフォルトでプライベートになります)。(間違っている場合は修正してください)。

本当じゃない。名前空間内で定義されたタイプ(クラス、構造体、インターフェースなど)は、デフォルトで内部になります。また、異なるタイプ内のメンバーは、異なるデフォルトのアクセス可能性(インターフェースメンバーのパブリックなど)を持っています。詳細については、MSDNのアクセシビリティレベルを参照してください。

また、

それで、そのキーワードを書く理由は何ですか、またはなぜそれが存在するのですか?

これを明示的に指定すると、型をプライベートにするという意図を非常に明示的に示すことができます。これにより、コードの長期にわたる保守が容易になります。これは、他の開発者(または自分自身)が、メンバーがデフォルトでまたは意図的に非公開であるかどうかを知るのに役立ちます。


1
@ウェイン:彼はジョンスキートよりも高いスコアの回答がありますが、それに値するものではありません...ジョンの回答の方がはるかに正確です。
aleroot

2
これは無意味な違いです。名前空間内の型は、デフォルトではプライベートにできないため、デフォルトでは内部です。それ以外の場合は何も使用できません。それらは、デフォルトでは、可能な限り制限されています。
ライアンランディ

1
inisdeクラスと構造体のデフォルトメンバーのアクセシビリティはプライベートです。ここを確認してください:msdn.microsoft.com/en-us/library/ba0a1yw2
v=vs.90).aspx

ただし、名前空間内の要素はできませんprivate
Shimmy Weitzhandler

また、getおよびset財産自体のアクセシビリティデフォルト
AustinWBryan

119

私の知る限り、プライベートはC#のどこでもデフォルトです

不正解です。デフォルトは「この宣言で使用できる最も制限されたアクセス」です。たとえば、トップレベルのタイプの場合、デフォルトはinternalです。ネストされた型のデフォルトはprivateです。

それで、そのキーワードを書く理由は何ですか、またはなぜそれが存在するのですか?

それはそれを明示的にします、それは2つの理由で良いです:

  • それはあなたの質問に従って、デフォルトを知らない人たちのためにそれをより明確にします(私はこの議論を個人的には好きではありませんが、言及する価値があると考えました)
  • デフォルトを使用するだけでなく、意図的に非公開にすることを決定したような印象を与えます。

あなたの最後の部分については:

また、「プライベート」(単独)でメンバーのアクセシビリティが変わるケースはありますか?

はい、プロパティの半分を他よりも制限を厳しくするため:

// Public getter, public setter
public int Foo { get; set; }

// Public getter, private setter
public int Bar { get; private set; }

以前は可能な限りどこでもデフォルトを使用していましたが、(一部はEric Lippertによって)それについて考えたことを明確にし、何かを非公開にすることを決定することは良い考えであると確信しました。

おそらくさえない-個人的に私は型宣言のために、あまりにも、密封された/シールされていないためにそれを行う方法があった希望持ってデフォルトを。多くの開発者(私が注意しなければ自分も含まれる)は、クラスを封印するよりも労力が少ないという理由だけで、クラスを封印解除したままにしているのではないかと思います。


+1。私のJavaの背景でfinalはより典型的な例を使用していますが、意味のない意図を示すために他の点では無関係なキーワードを使用することは有用です。
jprete

1
@minitech:逆の方法も機能しますが、あまり役に立ちません。これはすべてC#2で導入されました
Jon Skeet

20
私は確かにデフォルトがまったくなく、アクセス修飾子が欠落している場合にコンパイラがエラーをスローすることを望みます。私はほとんどの人がすべての状況でデフォルトが何であるかを知らないと思います、そしてそれは意図しないエラーにつながります。

+1「ネストされたタイプの場合、デフォルトはプライベートです」-私はあなたの答えを読んだときにこれについて知っています。ありがとう!
Nordin、2011

5
@ Phong、C#には1つの簡単なルールがあります。デフォルトでは、すべてが可能な限りプライベートです。 ネストされていないクラスなどの名前空間内のアイテムは、何も使用できないため、プライベートにすることはできません。それらは内部またはパブリックのみにすることができます。そのため、デフォルトでは内部にあります。他のものの内部のもの(クラス内の列挙型、ネストされたクラス、プロパティ、フィールド、メソッドなど)は、デフォルトではプライベートです。
Ryan Lundy

11

private視覚的な混乱を追加します。物事を明確にすることを主張する人に、私は尋ねます。あなたも数学でこれをしますか?例えば:

var answer = a + b / c;

かっこが不要で不明瞭だと思いますb / cか?

C#のルールは非常に単純です。デフォルトでは、すべてが可能な限りプライベートに近いです。 だから、あなたがする何かが必要な場合は、より多くの修飾子を追加し、デフォルトよりも見えます。それ以外の場合は、不要なキーワードをコードに追加しないでください。


1
質問する前に、私はこの権利に同意していました。しかし、VBやC ++、F#(Haskellなどの他の関数型言語からのもの)を書く人もいます。したがって、それら(および2年間c#を使用しなくなった後でそれを忘れた場合)にとっては、アクセサーが明示的である方が良いでしょう。簡単な学習がプロジェクトに与える影響を過小評価しないでください。多くの開発者は、選択したツールを反映していない可能性のあるバックグラウンドから来ており、本番用コードでも学習支援が必要です。これはまったく悪くありません(そして、非常に悪いC#をコード化するため、いくつかの支援が私たちにも役立ちます)。
Camilo Martin、

3
まあ、確かに、VBのデフォルトはひどいです。Friendたとえば、デフォルトの可視性はメンバー向けだと思います。C#は可視性のデフォルトを正しい方法で実行します。物事は、変更されない限り、最小限の可視性に設定されます。私が見つけたものから、それはC ++(構造体を除く)にも同じように見えます。(F#には当てはまらないようです。)
ライアンランディ

6
var視覚的な混乱を減らすため、多くの人がを支持しているのは奇妙ですが、それでも多くの人が無意味にタイピングを支持していますprivate
Ryan Lundy

2
私もその視覚的な混乱の主張するように、これまで行くだろう禁止の可読性を!
binki 2015

1
あなたの数学の例では括弧を使うことを好むが、賛成票を投じた。
Marc.2377

7

私の知る限り、C#ではどこでもプライベートがデフォルトです

明示的に宣言し、民間、あなたが意味を知っている、それはプライベートです。あなたが知っている限りでは、それがデフォルトであるため、そうだと思うだけではありません。また、コードを見る誰かがそれが何であるかを知っていることも意味します。

何等、「私はかなり確信して、それがあるんだ」、「私はそれだと思う」はありませんそれはちょうどです。そして、誰もが同じページにいます。

私はC#開発者ではありません。明示的にプライベートと宣言されていないコードを処理する必要がある場合、おそらくそれは内部コードであると思います。

物事が暗示的に設定されているときは嫌いです。それらが明示的に設定されている場合ほど明確ではありません。


合理的に聞こえますが、以前はよく知っていた言語の基本も忘れてしまいました。
Camilo Martin

6

読みやすさ-プライベートがデフォルトの動作であることを誰もが知っているとは限りません。

意図-プロパティをプライベートに宣言したことを明確に示します(何らかの理由で)。


5

読みやすさ、意図の実証は、私が考えることができる2つの大きな理由です。


同意した。たとえば、少しのコードで他の開発者と作業している場合、何かをプライベートに設定すると、意図を示すのに役立ちます。また、何年も経ってからコードに戻って、IDEがそのクラスでパブリックにアクセスできるメソッドを通知できる場合にも役立ちます。
アーロンニュートン

3

可視性を明示的に指定する1つの理由は、現在のコンテキストのデフォルトが何であるかを考える必要がないためです。

もう1つの理由は、FxCopがそれを行うように指示するためです。


+1、私はFxCopが変更を加えてビルドしたときにプライベートモディファイアを削除することについて不平を言うことに気づきました。
Camilo Martin

2

多くの人々(私のような人々!)は、いくつかの異なる言語で定期的にプログラミングを行っています。このようなことを明示することで、プログラミングするすべての言語の難解な詳細すべてを覚える必要がなくなります。


1
まあ、「デフォルトのアクセス修飾子はprivate」とは言わない難解な詳細であるが、要点は理解しています。先日、先週使用したフレームワーク(MEF)がどのように機能したかを思い出すのに苦労しました。
Camilo Martin

0

クラスの残りの範囲の読みやすさとの一貫性のために私は言うでしょう。


4
あなたはC ++を考えています。C#では、構造体であっても、メンバーはデフォルトでプライベートになります。

3
構造体にはデフォルトでパブリックアクセシビリティがありません-参照:msdn.microsoft.com/en-us/library/ba0a1yw2.aspx
Reed Copsey
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.