C# アクセス修飾子
C# アクセス修飾子
このチュートリアルでは、C# の public、private、protected、および internal アクセス修飾子について、例を使用して学習します。
C# では、アクセス修飾子は型 (クラス、インターフェイスなど) と型メンバー (フィールド、メソッドなど) のアクセシビリティを指定します。たとえば、
class Student {
public string name;
private int num;
}
ここで、
- 名前 - どこからでもアクセスできる公開フィールド
- 数 - プライベート フィールドは Student 内でのみアクセスできます クラス
アクセス修飾子の種類
C# には、4 つの基本的なタイプのアクセス修飾子があります。
- 公開
- 非公開
- 保護
- 社内
1.パブリック アクセス修飾子
型または型メンバー public
を宣言するとき 、どこからでもアクセスできます。たとえば、
using System;
namespace MyApplication {
class Student {
public string name = "Sheeran";
public void print() {
Console.WriteLine("Hello from Student class");
}
}
class Program {
static void Main(string[] args) {
// creating object of Student class
Student student1 = new Student();
// accessing name field and printing it
Console.WriteLine("Name: " + student1.name);
// accessing print method from Student
student1.print();
Console.ReadLine();
}
}
}
出力
Name: Sheeran Hello from Student class
上記の例では、Student という名前のクラスを作成しました。 フィールド name で およびメソッド print() .
// accessing name field and printing it
Console.WriteLine("Name: " + student1.name);
// accessing print method from Student
student1.print();
フィールドとメソッドは public であるため、Program からアクセスできます。 クラス。
注意 :オブジェクト student1 を使用しました 学生の そのメンバーにアクセスするためのクラス。詳細については、C# クラスとオブジェクトをご覧ください。 .
2.プライベート アクセス修飾子
private
で型メンバーを宣言するとき アクセス修飾子、同じ class
内でのみアクセスできます または struct
.たとえば、
using System;
namespace MyApplication {
class Student {
private string name = "Sheeran";
private void print() {
Console.WriteLine("Hello from Student class");
}
}
class Program {
static void Main(string[] args) {
// creating object of Student class
Student student1 = new Student();
// accessing name field and printing it
Console.WriteLine("Name: " + student1.name);
// accessing print method from Student
student1.print();
Console.ReadLine();
}
}
}
上記の例では、Student という名前のクラスを作成しました。 フィールド name で およびメソッド print() .
// accessing name field and printing it
Console.WriteLine("Name: " + student1.name);
// accessing print method from Student
student1.print();
フィールドとメソッドはプライベートであるため、プログラム からアクセスすることはできません クラス。ここで、コードは次のエラーを生成します。
Error CS0122 'Student.name' is inaccessible due to its protection level
Error CS0122 'Student.print()' is inaccessible due to its protection level
3.保護されたアクセス修飾子
型メンバーを protected
として宣言するとき 、同じクラスとその派生クラスからのみアクセスできます。たとえば、
using System;
namespace MyApplication {
class Student {
protected string name = "Sheeran";
}
class Program {
static void Main(string[] args) {
// creating object of student class
Student student1 = new Student();
// accessing name field and printing it
Console.WriteLine("Name: " + student1.name);
Console.ReadLine();
}
}
}
上記の例では、Student という名前のクラスを作成しました。 フィールド name で .フィールドは保護されているため、プログラムからアクセスすることはできません クラス。
ここで、コードは次のエラーを生成します。
Error CS0122 'Student.name' is inaccessible due to its protection level
では、protected
にアクセスしてみましょう。 派生クラスのメンバー。
using System;
namespace MyApplication {
class Student {
protected string name = "Sheeran";
}
// derived class
class Program : Student {
static void Main(string[] args) {
// creating object of derived class
Program program = new Program();
// accessing name field and printing it
Console.WriteLine("Name: " + program.name);
Console.ReadLine();
}
}
}
出力
Name: Sheeran
上記の例では、クラス Student を作成しました。 保護されたフィールド name を使用 . プログラムを継承していることに注意してください 生徒のクラス クラス。
// accessing name field and printing it
Console.WriteLine("Name: " + program.name);
protected
以降 member は派生クラスからアクセスでき、 name にアクセスできます プログラムから クラス。
4.内部アクセス修飾子
型または型メンバーを internal
として宣言するとき 、同じアセンブリ内でのみアクセスできます。
アセンブリは、型 (クラス、インターフェイスなど) とリソース (データ) のコレクションです。それらは連携して動作し、機能の論理ユニットを形成するように構築されています。
そのため、アセンブリを実行すると、アセンブリ内のすべてのクラスとインターフェイスが一緒に実行されます。詳細については、C# アセンブリにアクセスしてください。
例:同じアセンブリ内の内部
using System;
namespace Assembly {
class Student {
internal string name = "Sheeran";
}
class Program {
static void Main(string[] args) {
// creating object of Student class
Student theStudent = new Student();
// accessing name field and printing it
Console.WriteLine("Name: " + theStudent.name);
Console.ReadLine();
}
}
}
出力
Name: Sheeran
上記の例では、Student という名前のクラスを作成しました。 フィールド name で .フィールドは internal
なので 、プログラムからアクセスできます
internal
を使用する場合 単一のアセンブリ内では、public
と同じように機能します。 アクセス修飾子。
例:異なるアセンブリ内の内部
最初に 1 つのアセンブリを作成しましょう。
// Code on Assembly1
using System;
namespace Assembly1 {
public class StudentName {
internal string name = "Sheeran";
}
class Program {
static void Main(string[] args) {
}
}
}
このコードは Assembly1 にあります .内部フィールド name を作成しました クラス StudentName 内 .現在、このフィールドは同じアセンブリ Assembly1 からのみアクセスできます .
それでは、別のアセンブリを作成しましょう。
// Code on Assembly2
using System;
// access Assembly1
using Assembly1;
namespace Assembly2 {
class Program {
static void Main(string[] args) {
StudentName student = new StudentName();
// accessing name field from Assembly1
Console.Write(student.name);
Console.ReadLine();
}
}
}
このコードは Assembly2 にあります . name にアクセスしようとしています StudentName のフィールド class(Assembly1 ).
Assembly1 からフィールドにアクセスするには 、まず Assembly1 の参照を設定する必要があります Assembly2 で .コード
using Assembly1;
Assembly1 のコードを使用できます Assembly2 へ .
ここで、name にアクセスしようとすると Assembly2 のフィールド 、エラーが発生します。
Error CS0122 'StudentName.name' is inaccessible due to its protection level
これは name のためです Assembly1 に存在する内部フィールドです .
5.保護された内部アクセス修飾子
protected internal
protected
の組み合わせです と internal
アクセス修飾子。
メンバー protected internal
を宣言するとき 、同じアセンブリ、および他のアセンブリからの包含クラスの派生クラスからアクセスできます。
// Code on Assembly1
using System;
namespace Assembly1 {
public class Greet {
protected internal string msg="Hello";
}
class Program {
static void Main(string[] args) {
Greet greet = new Greet();
Console.WriteLine(greet.msg);
Console.ReadLine();
}
}
}
出力
Hello
上記のコードは Assembly1 にあります .
上記の例では、Greet という名前のクラスを作成しました。 フィールド msg で .フィールドは内部で保護されているため、プログラムからアクセスできます
Greet からクラスを派生させましょう 別のアセンブリで、保護された内部フィールド msg へのアクセスを試みます
// Code on Assembly2
using System;
// access Assembly1
using Assembly1;
namespace Assembly2 {
// derived class of Greet
class Program: Greet {
static void Main(string[] args) {
Program greet = new Program();
// accessing name field from Assembly1
Console.Write(greet.msg);
Console.ReadLine();
}
}
}
出力
Hello
上記のコードは Assembly2 にあります .
上記の例では、Program を継承しています。 挨拶のクラス クラス (Assembly1 から) ).
// accessing name field from Assembly1
Console.Write(greet.msg);
msg にアクセスできます 挨拶から Assembly1 のクラス Assembly2 から .
これは msg は保護された内部フィールドであり、Greet の子クラスからアクセスしようとしています .
6.プライベート保護アクセス修飾子
private protected
アクセス修飾子は private
の組み合わせです と protected
. C# バージョン 7.2 以降で使用できます。
メンバー private protected
を宣言するとき 、同じクラス内、および同じアセンブリ内のその派生クラス内でのみアクセスできます。たとえば、
// Code in Assembly1
using System;
namespace Assembly1 {
public class StudentName {
private protected string name = "Sheeran";
}
//derived class of StudentName class
class Program1 : StudentName {
static void Main(string[] args) {
Program1 student = new Program1();
// accessing name field from base class
Console.Write(student.name);
Console.ReadLine();
}
}
}
出力
Sheeran
上記のコードは Assembly1 にあります
上記の例では、クラス StudentName を作成しました。 private protected
で フィールド 名前 .
Program1 を継承していることに注意してください StudentName のクラス クラス。
private protected
以降 member は同じアセンブリ内の派生クラスからアクセスでき、 name にアクセスできます Program1 から クラス。
StudentName からクラスを派生させましょう 別のアセンブリで、プライベート保護フィールド name へのアクセスを試みます それから。たとえば、
// Code in Assembly2
using System;
//access Assembly1
using Assembly1;
namespace Assembly2 {
//derived class of StudentName
class Program : StudentName {
static void Main(string[] args) {
Program student = new Program();
// accessing name field from Assembly1
Console.Write(student.name);
Console.ReadLine();
}
}
}
上記のコードは Assembly2 にあります
上記の例では、name にアクセスしようとすると StudentName の派生クラスのフィールド 、エラーが発生します。
Error CS0122 'StudentName.name' is inaccessible due to its protection level
これは、名前 フィールドは Assembly1 にあります 派生クラスは Assembly2 にあります .
注意 :タイプ (クラス、インターフェースなど) でアクセス修飾子を使用することもできます。ただし、パブリックおよび内部アクセス修飾子を持つ型のみを使用できます。
C言語