1. ホーム
  2. c#

[解決済み】なぜ内部クラスでパブリックメソッドを使用するのですか?

2022-04-17 21:03:24

質問

私たちのプロジェクトの1つに、次のようなコードがたくさんあります。

internal static class Extensions
{
    public static string AddFoo(this string s)
    {
        if (s == null)
        {
            return "Foo";
        }

        return $({s}Foo);
    }
}

これを行う明確な理由は、"後で型を公開するのが簡単だから、" 以外にあるでしょうか。

非常に奇妙なエッジケース(Silverlightにおけるリフレクション)でしか問題にならないか、まったく問題にならないのではないかと思っています。

解決方法は?

UPDATE: この質問は 2014年9月にブログで取り上げたテーマ . 素晴らしい質問をありがとうございました

この質問については、コンパイラー・チーム内でもかなりの議論があります。

まず、ルールを理解することが賢明です。クラスや構造体のパブリック・メンバーとは、以下のようにアクセス可能なメンバーのことです。 を含む型にアクセスできるものであれば、何にでもアクセスできます。 . つまり、内部クラスのパブリックメンバーは、事実上内部クラスです。

では、内部クラスがある場合、アセンブリでアクセスしたいメンバはpublicとinternalのどちらでマークすべきでしょうか。

私の意見は、そのようなメンバーはpublicとマークすることです。

私は、quot;public" を、quot;このメンバは実装の詳細ではない、という意味で使っています。protected メンバは実装の詳細であり、派生クラスを動作させるために必要な何かがあります。内部メンバは実装の詳細です。このアセンブリの内部の他の何かが、正しく動作するためにこのメンバを必要とします。public メンバは、「このメンバは、このオブジェクトが提供する主要な、文書化された機能を表します。

基本的には、「この内部クラスをパブリッククラスにすることにした」という姿勢です。そのために、私は たった一つのこと クラスのアクセシビリティ 内部クラスをパブリッククラスにするということは、内部メンバもパブリックメンバにしなければならないのであれば、そのメンバは パブリックサーフェスエリア であり、そもそもパブリックであるべきなのです。

他の人は反対です。あるメンバの宣言を一目見て、それが内部コードからのみ呼び出されるものなのかどうかがすぐにわかるようにしたい、というコンテンポラリーな人たちもいるのです。

例えば、内部インタフェースを実装する内部クラスは、実装メンバをpublicとマークしなければなりません。 それらはクラスのパブリックサーフェスの一部です。 .