C# クラスメンバのアクセス修飾子

C#のクラスメンバのアクセス修飾子のサンプルです。

確認環境
・Microsoft Visual Studio Community 2019

目次

説明 クラスメンバのアクセス修飾子
サンプル 確認環境
  メソッドにアクセス修飾子をつけたクラス(Color.cs)
  別プロジェクトのクラスを使用するクラス(Test1.cs)

クラスメンバのアクセス修飾子

クラスメンバのアクセス修飾子です。

項目 説明
public 別のプロジェクトまたは同じプロジェクトからアクセス可能
internal 同じプロジェクトからアクセス可能
protected 1.派生クラス(子クラス)からアクセス可能
→他プロジェクトからも可能
2.同じクラスからアクセス可能
protected internal 1.派生クラス(子クラス)からアクセス可能(protected)
→他プロジェクトからも可能
2.同じプロジェクトからアクセス可能(internal)
修飾子なし 同じクラスからアクセス可能
private 同じクラスからアクセス可能
private protected 1.派生クラス(子クラス)からアクセス可能(protected)。
→同じプロジェクトからのみ。
2.同じクラスからアクセス可能(private)

アクセス修飾子は、アクセスの範囲を限定します。(スコープを狭める)
範囲が限定されていると、修正時に影響する範囲が狭まり修正しやすくなります。
プロジェクトは、アセンブリとも呼ばれます。

以下は、Microsoftのアクセス修飾子 (C# プログラミング ガイド)のリンクです。
https://docs.microsoft.com/ja-jp/dotnet/csharp/programming-guide/classes-and-structs/access-modifiers

確認環境

プロジェクトが2つあります。csharp1とcsharp2です。

Color.csにアクセス修飾子をつけたメソッドがあります。
Test1.cs内には、Color.csにあるクラスを継承したクラスと継承していないクラスがあります。

メソッドにアクセス修飾子をつけたクラス(Color.cs)

それぞれにアクセス修飾子をつけています。
public、protected internal、protected、internal、なし、privateがあります。

using System;

namespace csharp2
{
	public class Color
	{
		//public
		public void GetName1()
		{
			Console.WriteLine("赤:public"); //
		}
		//protected internal
		protected internal void GetName2()
		{
			Console.WriteLine("黄:protected internal"); //
		}
		//protected 
		protected void GetName3()
		{
			Console.WriteLine("青:protected"); //
		}
		//internal 
		internal void GetName4()
		{
			Console.WriteLine("緑:internal"); //
		}
		//なし
		void GetName5()
		{
			Console.WriteLine("白:なし"); //
		}
		//private 
		private void GetName6()
		{
			Console.WriteLine("黒:private"); //
		}
		//private protected 
		private protected void GetName7()
		{
			Console.WriteLine("紫:private protected"); //
		}
	}
	class Test
	{
		static void Main()
		{
		}
	}
}

別プロジェクトのクラスを使用するクラス(Test1.cs)

別プロジェクトのクラスを使用するクラスです。
TestClass1は、Colorクラスのインスタンスを生成して実行しています。
TestClass2は、Colorクラスを継承しているのでインスタンスの生成はしていません。

using csharp2;

namespace csharp1
{
	class TestClass1
	{
		public void Write1()
		{
			Color p1 = new Color();
			p1.GetName1(); //赤:public
			//p1.GetName2(); //コンパイルエラー
			//p1.GetName3(); //コンパイルエラー
			//p1.GetName4(); //コンパイルエラー
			//p1.GetName5(); //コンパイルエラー
			//p1.GetName6(); //コンパイルエラー
			//p1.GetName7(); //コンパイルエラー
		}
	}
	class TestClass2:Color
	{
		public void Write2()
		{
			GetName1(); //赤:public
			GetName2(); //黄:protected internal
			GetName3(); //青:protected
			//GetName4(); //コンパイルエラー
			//GetName5(); //コンパイルエラー
			//GetName6(); //コンパイルエラー
			//GetName7(); //コンパイルエラー
		}
	}
	class Test1
	{
		static void Main()
		{
			TestClass1 t1 = new TestClass1();
			t1.Write1();

			TestClass2 t2 = new TestClass2();
			t2.Write2();
		}
	}
}

別プロジェクトのクラスのインスタンスを生成した場合は、
publicのみ実行できました。
それ以外は、コンパイルエラーです。

別プロジェクトのクラスを継承していた場合は、
publicとprotected internalとprotectedが実行できました。
それ以外は、コンパイルエラーです。

関連の記事

C#入門 クラスの仕組みとサンプル
C# クラスのメソッド(名前/デフォルト/可変長引数)
C# クラスのメソッド(値渡し/参照渡し/戻り値が複数)
C# コンストラクタのサンプル
C# クラスの継承の仕組みとサンプル

△上に戻る