工業製造
産業用モノのインターネット | 工業材料 | 機器のメンテナンスと修理 | 産業プログラミング |
home  MfgRobots >> 工業製造 >  >> Industrial programming >> C言語

C# アクセス修飾子

C# アクセス修飾子

このチュートリアルでは、C# の public、private、protected、および internal アクセス修飾子について、例を使用して学習します。

C# では、アクセス修飾子は型 (クラス、インターフェイスなど) と型メンバー (フィールド、メソッドなど) のアクセシビリティを指定します。たとえば、

class Student {

  public string name;
    
  private int num;

  }

ここで、

アクセス修飾子の種類

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言語

  1. C# クラスとオブジェクト
  2. C# 静的キーワード
  3. C# の抽象クラスとメソッド
  4. C# ネストされたクラス
  5. C# 部分クラスと部分メソッド
  6. C# の封印されたクラスとメソッド
  7. C++ クラス テンプレート
  8. C ストレージ クラス
  9. Java - 修飾子の種類
  10. C++ のポリモーフィズム
  11. C++ でのデータの抽象化