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# クラスの継承の仕組みとサンプル