Industriële fabricage
Industrieel internet der dingen | Industriële materialen | Onderhoud en reparatie van apparatuur | Industriële programmering |
home  MfgRobots >> Industriële fabricage >  >> Industrial programming >> C Taal

C# Toegangsmodificaties

C#-toegangsmodificaties

In deze tutorial leren we over de publieke, private, beschermde en interne toegangsmodifiers in C# met behulp van voorbeelden.

In C# specificeren toegangsmodifiers de toegankelijkheid van typen (klassen, interfaces, enz.) en typeleden (velden, methoden, enz.). Bijvoorbeeld,

class Student {

  public string name;
    
  private int num;

  }

Hier,

  • naam - openbaar veld dat overal toegankelijk is
  • aantal - privéveld is alleen toegankelijk binnen de Student klas

Typen toegangsmodificaties

In C# zijn er 4 basistypen toegangsmodifiers.

  • openbaar
  • privé
  • beschermd
  • intern

1. modificatie voor openbare toegang

Wanneer we een type of type lid verklaren public , het is overal toegankelijk. Bijvoorbeeld,

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();
    }
  }
}

Uitvoer

Name: Sheeran
Hello from Student class

In het bovenstaande voorbeeld hebben we een klas gemaakt met de naam Student met een veld naam en een methode print() .

// accessing name field and printing it
Console.WriteLine("Name: " + student1.name);

// accessing print method from Student
student1.print();

Aangezien het veld en de methode openbaar zijn, kunnen we ze openen vanuit het Programma klasse.

Opmerking :We hebben het object student1 . gebruikt van de Student klasse om toegang te krijgen tot zijn leden. Ga voor meer informatie naar de C#-klasse en objecten .


2. modifier voor privétoegang

Wanneer we een type lid declareren met de private access modifier, het is alleen toegankelijk binnen dezelfde class of struct . Bijvoorbeeld,

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();
    }
  }
}

In het bovenstaande voorbeeld hebben we een klas gemaakt met de naam Student met een veld naam en een methode print() .

// accessing name field and printing it
Console.WriteLine("Name: " + student1.name);

// accessing print method from Student
student1.print();

Aangezien het veld en de methode privé zijn, kunnen we ze niet openen vanuit het Programma klas. Hier genereert de code de volgende fout.

Error    CS0122    'Student.name' is inaccessible due to its protection level    
Error    CS0122    'Student.print()' is inaccessible due to its protection level    

3. beveiligde toegang modifier

Wanneer we een typelid declareren als protected , het is alleen toegankelijk vanuit dezelfde klasse en de daarvan afgeleide klassen. Bijvoorbeeld,

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();
    }
  }
}

In het bovenstaande voorbeeld hebben we een klas gemaakt met de naam Student met een veld naam . Omdat het veld beveiligd is, hebben we er geen toegang toe vanuit het Programma klasse.

Hier genereert de code de volgende fout.

Error    CS0122    'Student.name' is inaccessible due to its protection level    

Laten we nu proberen toegang te krijgen tot de protected lid van een afgeleide klasse.

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();
    }
  }
}

Uitvoer

Name: Sheeran

In het bovenstaande voorbeeld hebben we een klas Student . gemaakt met een beveiligd veld naam . Merk op dat we het Programma . hebben geërfd klas van de leerling klasse.

// accessing name field and printing it
Console.WriteLine("Name: " + program.name);

Sinds de protected lid kan worden benaderd vanuit afgeleide klassen, we hebben toegang tot naam uit het Programma klasse.


4. interne toegangsmodifier

Wanneer we een type of typelid declareren als internal , het is alleen toegankelijk binnen dezelfde assembly.

Een assembly is een verzameling van typen (klassen, interfaces, enz.) en bronnen (gegevens). Ze zijn gebouwd om samen te werken en vormen een logische eenheid van functionaliteit.

Dat is de reden waarom wanneer we een assembly uitvoeren, alle klassen en interfaces binnen de assembly samen worden uitgevoerd. Ga voor meer informatie naar de C#-assemblage.


Voorbeeld:intern binnen dezelfde Assembly

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();
    }
  }
}

Uitvoer

Name: Sheeran

In het bovenstaande voorbeeld hebben we een klas gemaakt met de naam Student met een veld naam . Aangezien het veld internal . is , we hebben er toegang toe vanuit het Programma klasse aangezien ze in dezelfde assembly zitten.

Als we internal . gebruiken binnen een enkele assembly werkt het net als de public toegangsmodifier.


Voorbeeld:intern in verschillende montage

Laten we eerst één assembly maken.

// Code on Assembly1
using System;

namespace Assembly1 {

  public class StudentName {
    internal string name = "Sheeran";
  }

  class Program {
    static void Main(string[] args) {
    }
  }
}

Hier staat deze code in Assembly1 . We hebben een intern veld gemaakt naam binnen de klas StudentName . Dit veld is nu alleen toegankelijk vanuit dezelfde assembly Assembly1 .

Laten we nu een andere assembly maken.

// 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();
     }
  }
}

Hier staat deze code in Assembly2 . We proberen toegang te krijgen tot de naam veld van de StudentName class(Assemblage1 ).

Velden openen vanuit Assembly1 , moeten we eerst de referentie van Assembly1 . instellen in Assemblage2 . Nu de code

using Assembly1;

stelt ons in staat om de code van Assembly1 . te gebruiken naar Assemblage2 .

Hier, wanneer we proberen toegang te krijgen tot de naam veld van Assembly2 , krijgen we een foutmelding.

Error    CS0122    'StudentName.name' is inaccessible due to its protection level

Dit komt omdat naam is een intern veld aanwezig in Assembly1 .


5. beveiligde interne toegangsmodifier

De protected internal is een combinatie van protected en internal toegangsmodifiers.

Wanneer we een lid verklaren protected internal , het is toegankelijk vanuit dezelfde assembly en de afgeleide klasse van de bevattende klasse vanuit elke andere assembly.

// 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();
     }
  }
}

Uitvoer

Hello

De bovenstaande code bevindt zich in Assembly1 .

In het bovenstaande voorbeeld hebben we een klasse gemaakt met de naam Greet met een veld bericht . Omdat het veld intern is beveiligd, hebben we er toegang toe vanuit het Programma klasse aangezien ze in dezelfde assembly zitten.

Laten we een les afleiden van Greet in een andere assembly en probeer toegang te krijgen tot het beveiligde interne veld msg ervan.

// 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();
    }
  }
}

Uitvoer

Hello

De bovenstaande code staat in Assembly2 .

In het bovenstaande voorbeeld hebben we het Programma . geërfd klas van de Groet class(van Assembly1 ).

// accessing name field from Assembly1
Console.Write(greet.msg);

We hebben toegang tot het bericht van de Groet klasse van Assemblage1 van Assembly2 .

Dit komt omdat het bericht is een beveiligd intern veld en we proberen het te openen vanuit de onderliggende klasse van Greet .


6. privé beveiligde toegang modifier

De private protected access modifier is een combinatie van private en protected . Het is beschikbaar vanaf de C#-versie 7.2 en later.

Wanneer we een lid verklaren private protected , het is alleen toegankelijk binnen dezelfde klasse en de afgeleide klasse binnen dezelfde assembly. Bijvoorbeeld,

// 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();
    }
  }
}

Uitvoer

Sheeran

De bovenstaande code bevindt zich in Assembly1

In het bovenstaande voorbeeld hebben we een klasse StudentName . gemaakt met een private protected veld naam .

Merk op dat we het Programma1 . hebben geërfd klasse uit de StudentName klasse.

Sinds de private protected lid kan worden benaderd vanuit afgeleide klassen binnen dezelfde assembly, we hebben toegang tot name uit het Programma1 klasse.

Laten we een klas afleiden van StudentName in een andere assembly en probeer toegang te krijgen tot het privé beveiligde veld name ervan. Bijvoorbeeld,

// 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();
     }
  }
}

De bovenstaande code staat in Assembly2

In het bovenstaande voorbeeld, wanneer we proberen toegang te krijgen tot de naam veld uit de afgeleide klasse van StudentName , krijgen we een foutmelding.

Error    CS0122    'StudentName.name' is inaccessible due to its protection level    

Dit komt omdat de naam veld bevindt zich in Assembly1 en de afgeleide klasse bevindt zich in Assembly2 .

Opmerking :We kunnen ook toegangsmodifiers gebruiken met typen (klassen, interface, enz.). We kunnen echter alleen typen gebruiken met openbare en interne toegangsmodifiers.


C Taal

  1. C# klasse en object
  2. C# statisch trefwoord
  3. C# abstracte klasse en methode
  4. C# geneste klasse
  5. C# Gedeeltelijke klasse en gedeeltelijke methode
  6. C# verzegelde klasse en methode
  7. C++-klassesjablonen
  8. C opslagklasse
  9. Java - Modificatietypen
  10. Polymorfisme in C++
  11. Gegevensabstractie in C++