web-dev-qa-db-ja.com

C#でのプライベートクラスの概念

プライベートクラスは、内部クラス以外のC#に存在できますか?

37
Vinod Bhatt

単にNO。ネストされたクラスでない限り、何もありません

  • 他のクラスまたは構造体内にネストされていないクラスと構造体は、publicまたはinternal。 publicとして宣言された型は、他の型からアクセスできます。内部として宣言された型は、同じアセンブリ内の型からのみアクセスできます。クラスpublicがクラス定義に追加されていない限り、クラスと構造体はデフォルトでinternalとして宣言されます。

  • クラスまたは構造体の定義では、内部キーワードを追加して、アクセスレベルを明示的にすることができます。アクセス修飾子は、クラスや構造体自体には影響しません。常にそれ自体とそのすべてのメンバーにアクセスできます。

  • ネストされたクラスや構造体を含む構造体メンバーは、パブリック、内部、またはプライベートとして宣言できます。ネストされたクラスや構造体を含むクラスメンバーは、パブリック、保護された内部、保護された、内部、またはプライベートにすることができます。ネストされたクラスと構造体を含む、クラスメンバーと構造体メンバーのアクセスレベルは、デフォルトではプライベートです。ネストされたプライベートタイプには、包含タイプの外部からアクセスできません。

  • 派生クラスは、その基本型よりも大きなアクセシビリティを持つことはできません。言い換えると、内部クラスAから派生するパブリッククラスBは使用できません。これが許可されている場合、Aのすべての保護メンバーまたは内部メンバーに派生クラスからアクセスできるため、Aをパブリックにする効果があります。


    InternalsVisibleToAttribute を使用して、特定の他のアセンブリが内部タイプにアクセスできるようにすることができます。
43
Shekhar_Pro

いいえ、ありません。ネストされない限り、プライベートクラスを持つことはできません。

13
Darin Dimitrov

それ以外のシナリオでは、内部クラスに対して「プライベート」クラスが必要ですか?

internal修飾子を使用して、現在のアセンブリでのみ表示されるクラスを作成できます。

// the class below is only visible inside the Assembly in where it was declared
internal class MyClass
{
}
2

いいえ。そのようなクラスのスコープはどうなりますか?

2
Patman

クラスを他のクラス内でプライベートとして宣言できます。同じことを達成する方法について、以下のコードを親切に見つけてください:

 public class Class1
  {
    temp _temp ;
    public Class1()
    {
      _temp = new temp();   
    }    

    public void SetTempClass(string p_str, int p_Int)
    {
      _temp.setVar(p_str, p_Int);
    }

    public string GetTempClassStr()
    {
      return _temp.GetStr();
    }

    public int GetTempClassInt()
    {
      return _temp.GetInt();
    }

    private class temp
    {
      string str;
      int i;

      public void setVar(string p_str, int p_int)
      {
        str = p_str;
        i = p_int;
      }

      public string GetStr()
      {
        return str;
      }

      public int GetInt()
      {
        return i;
      }
    }
  }
0
SPARTAN