デフォルトで内部公開または公開公開を使用する必要がありますか?

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

  •  01-07-2019
  •  | 
  •  

質問

私は C# と .Net の開発者としてはかなり初心者です。最近、C# を使用して MMC スナップインを作成しましたが、特に組織内の他の開発者から、C++ で行うのがいかに難しいかについての恐ろしい話をたくさん聞いた後では、その簡単さに満足しました。

私はある時点でプロジェクト全体をほとんど検討し、スナップインを実行するためにランタイムで必要な場合を除いて、「public」キーワードのすべてのインスタンスを「internal」にしました。これについてはどう思いますか。クラスとメソッドは一般に公開するべきですか、それとも内部的に作成すべきですか?

役に立ちましたか?

解決

私は可能な限りブラックボックスを信じています。プログラマーとして、私はシステムに簡単に落とし込んで動作させることができる、明確に定義されたブラックボックスを望んでいます。値を指定し、適切なメソッドを呼び出して、そこから結果を取得します。

そのためには、クラスが動作するために公開する必要がある機能のみを提供してください。

エレベーターを考えてみましょう。床に移動させるには、ボタンを押します。これは、エレベーターを目的の階に移動するために必要なすべての機能を起動するブラック ボックスへのパブリック インターフェイスです。

他のヒント

あなたがしたことは、まさにあなたがすべきことです。クラスの可視性を最小限に抑えます。てか、本当に丸ごと食べたいなら、次のように作れます。 すべて internal (せいぜい) InternalsVisibleTo 属性, 、これにより、機能を分離できますが、未知の外部世界に公開することはありません。

公開する唯一の理由は、プロジェクトを複数の DLL や EXE にパッケージ化しており、(何らかの理由で) 使用する必要がないことです。 InternalsVisibleTo, 、またはサードパーティが使用するライブラリを作成している場合。ただし、サードパーティが使用するライブラリであっても、可能な限り「表面積」を削減するように努める必要があります。利用可能なクラスが増えるほど、ライブラリはさらに混乱します。

C# では、可能な限り最小限の可視性を使用していることを確認する良い方法の 1 つは、必要になるまで可視性修飾子を使用しないことです。C# のすべては、デフォルトで可能な限り可視性が低く設定されています。クラスの場合は内部、クラスのメンバーと内部クラスの場合はプライベートです。

内部クラスとメンバーの側で間違いを犯すべきだと思います。アイテムの可視性はいつでも高めることができますが、減らすと問題が発生する可能性があります。これは、他の人のためにフレームワークを構築している場合に特に当てはまります。

ただし、便利な機能をユーザーに隠さないように注意する必要があります。.NET BCL には、リフレクションに頼らなければ使用できない便利なメソッドが多数あります。ただし、これらのメソッドを非表示にすることで、テストおよび保守が必要な表面積が減少します。

クラスを次のようにマークすることは避けたいと考えています public ただし、顧客に消費してもらいたいと明示的に望んでおり、顧客をサポートする用意がある場合は除きます。

クラスを次のようにマークする代わりに internal, アクセシビリティは空白のままにします。こちらです、 public 注目すべきものとして目に浮かびます。(もちろん、入れ子になったクラスは例外で、同じアセンブリ内であっても表示されるようにするにはマークする必要があります。)

ほとんどのクラスは次のようになります。 internal, 、ただし、非公開メンバーのほとんどは、次のようにする必要があります。 public.

メンバーについて尋ねるべき質問は、「クラスが作成されたかどうか」です。 public メンバーを暴露したいですか?」答えは通常「はい(だから)」です。 public)" アクセス可能なメンバーが存在しないクラスはあまり役に立たないからです。internal メンバーには役割があります。これらは、同じ集会に住んでいる近親者のみを対象とした「裏口アクセス」です。

クラスが内部に残っている場合でも、どれがフロントドア メンバーでどれがバックドア メンバーであるかを確認できるのは便利です。そして、それをパブリックに変更した場合でも、どれがどれなのかを遡って考える必要はありません。

他のクラスにはできるだけ公開しないようにし、何を公開するのか、そしてなぜ公開するのかを慎重に考える必要があります。

プライベートではなく内部を使用する必要がある理由はありますか?内部にはアセンブリ レベルのスコープがあることがわかります。言い換えれば、内部クラス/メンバーは、マルチクラス アセンブリ内のすべてのクラスからアクセスできます。

他の回答にもあるように、実際に内部/保護/パブリックが必要でない限り、一般的には可能な限り最高レベルのカプセル化(つまりプライベート)を選択してください。

見つけました 内部クラスの使用に関する問題 できるだけ。その型 (またはパラメーターの型や戻り値の型) のメソッド、プロパティ、フィールドなどを内部よりも見やすくすることはできません。これにより、プロパティだけでなく内部のコンストラクターも必要になります。これは問題にはならないはずですが、実際のところ、Visual Studio と xaml デザイナーを使用する場合には問題が発生します。 誤検知エラーは設計者によって検出される メソッドがパブリックではないため、ユーザー コントロールのプロパティは設計者には見えないようです。他の人がすでにそのような問題に陥っているかどうかはわかりません...

それらはできるだけ表示されるようにする必要がありますが、上記の Mike が述べたように、これにより、UserControls や、フォームまたは他の UserControls 上のそれらのコントロールで VS Designer を使用する際に問題が発生します。

したがって、一般的なルールとして、デザイナーを使用して追加していないすべてのクラスと UserControl は、必要なときにのみ表示されるようにしてください。デザイナーで使用する UserControl を作成する場合は (同じアセンブリ内であっても)、UserControl クラス、その既定のコンストラクター、プロパティ、およびイベントがデザイナーに対して公開されていることを確認する必要があります。それを使って作業します。

最近、UserControl MyControl がコンストラクターとともに内部としてマークされているため、デザイナーが InitializeComponent() メソッドから this.myControl = new MyControl() 行を削除し続けるという問題がありました。

これは本当にバグだと思います。内部としてマークされていても、デザイナーに追加するツールボックスに表示されるからです。Microsoft は、パブリック コンストラクターを持つパブリック コントロールのみを表示するか、内部コントロールと連携して機能させる必要があるかのどちらかです。良い。

それは、それを使用するコードをどの程度制御できるかによって異なります。私の Java 開発では、ゲッターが煩わしいため、デフォルトですべての内容を public Final にしています。ただし、いつでもコードベースの内容を変更できるという贅沢もあります。これまで、コードをコンシューマにリリースする必要があるときは、常にプライベート変数とゲッターを使用していました。

特定のクラスの可視性のニーズに最も適合する「デフォルト」の選択を選択しないでください。Visual Studio で新しいクラスを選択すると、テンプレートは次のように作成されます。

class Class1
{
}

これはプライベートです (スコープが指定されていないため)。クラスのスコープを指定するか (またはプライベートのままにするか) はあなた次第です。クラスを公開するには理由があるはずです。

私は物事をできるだけ露出しないようにしています。プライベート、保護された、内部、パブリック:クラス、変数、プロパティ、関数に、すべてが機能するために必要な最小限の可視性を与えます。

正当な理由がある場合にのみ、何かの可視性をそのチェーン上で一般公開に上げます。

私はこれまでの答えに完全に同意しません。内部というのはひどいアイデアだと思います。別のアセンブリが型を継承できないようにしたり、回避策が必要になった場合には内部型を使用したりすることさえできます。

今日、System.Data.DataTable の内部にアクセスするためにリフレクションを使用する必要がありました (すべてのチェックを行わずに、データテーブルを超高速で構築する必要がありました)。また、単一の型ではないため、リフレクションを使用する必要がありました。私には利用可能でした。それらはすべて内部としてマークされていました。

デフォルトでは、クラスは C# の内部として作成されます。内部的な意味:アクセスは現在のアセンブリに制限されます。

見るhttp://msdn.microsoft.com/en-us/library/0b0thckt.aspx

デフォルトのスコープが内部である良い記事:http://www.c-sharpcorner.com/UploadFile/84c85b/default-scope-of-a-C-Sharp-class/

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top