Sobes.tech
Junior

Quali sono i modificatori di accesso in C#?

sobes.tech AI

Risposta dell'AI

In C# esistono i seguenti modificatori di accesso:

  1. public: L'accesso non è limitato. I membri contrassegnati come public sono accessibili da qualsiasi luogo in cui il loro tipo contenitore è accessibile.
  2. private: L'accesso è limitato al loro tipo contenitore. I membri contrassegnati come private sono accessibili solo dal codice all'interno della stessa classe o struttura.
  3. protected: L'accesso è limitato al tipo che lo contiene o ai tipi derivati da esso. I membri contrassegnati come protected sono accessibili all'interno della loro classe e nelle classi derivate.
  4. internal: L'accesso è limitato alla compilazione corrente (.dll o .exe). I membri contrassegnati come internal sono accessibili da qualsiasi luogo all'interno della stessa compilazione.
  5. protected internal: L'accesso è limitato alla compilazione corrente o ai tipi derivati del tipo che lo contiene in altre compilazioni. È una combinazione di protected e internal.
  6. private protected: L'accesso è limitato al tipo che lo contiene o ai tipi derivati di quel tipo solo nella stessa compilazione. È una combinazione di private e protected.
// Esempio di utilizzo dei modificatori di accesso
public class MyClass
{
    public int PublicField;        // Accessibile da qualsiasi luogo
    private int PrivateField;      // Accessibile solo all'interno di MyClass
    protected int ProtectedField;  // Accessibile all'interno di MyClass e nelle classi derivate
    internal int InternalField;    // Accessibile all'interno della compilazione corrente
    protected internal int ProtectedInternalField; // Accessibile all'interno della compilazione corrente O nelle classi derivate
    private protected int PrivateProtectedField; // Accessibile all'interno di MyClass O nelle classi derivate in questa stessa compilazione

    void MyMethod()
    {
        PrivateField = 10; // OK
    }
}

public class DerivedClass : MyClass
{
    void DerivedMethod()
    {
        ProtectedField = 20; // OK
        // PrivateField = 30; // Errore - campo privato non accessibile in ereditarietà
        ProtectedInternalField = 40; // OK
        PrivateProtectedField = 50; // OK
    }
}

public class AnotherClassInSameAssembly
{
    void AnotherMethod()
    {
        MyClass mc = new MyClass();
        mc.PublicField = 1; // OK
        mc.InternalField = 2; // OK
        mc.ProtectedInternalField = 3; // OK
        // mc.PrivateField = 4; // Errore
        // mc.ProtectedField = 5; // Errore
        // mc.PrivateProtectedField = 6; // Errore
    }
}