Modificatori di accesso (Guida per programmatori C#)Access Modifiers (C# Programming Guide)

Tutti i tipi e i membri dei tipi hanno un livello di accessibilità, che controlla se possono essere usati da altro codice nell'assembly o in assembly di terze parti.All types and type members have an accessibility level, which controls whether they can be used from other code in your assembly or other assemblies. È possibile usare i modificatori di accesso seguenti per specificare l'accessibilità di un tipo o di un membro quando viene dichiarato:You can use the following access modifiers to specify the accessibility of a type or member when you declare it:

publicpublic
Il tipo o il membro è accessibile da altro codice nello stesso assembly o in un altro assembly che vi fa riferimento.The type or member can be accessed by any other code in the same assembly or another assembly that references it.

privateprivate
Il tipo o il membro è accessibile solo dal codice nella stessa classe o struct.The type or member can be accessed only by code in the same class or struct.

protectedprotected
Il tipo o membro è accessibile solo dal codice nella stessa classe o in una classe derivata da tale classe.The type or member can be accessed only by code in the same class, or in a class that is derived from that class.
internalinternal
Il tipo o il membro è accessibile dal codice nello stesso assembly ma non da un altro assembly.The type or member can be accessed by any code in the same assembly, but not from another assembly.

protected internal Il tipo o il membro è accessibile da qualsiasi codice dell'assembly in cui viene dichiarato o dall'interno di una classe derivata in un altro assembly.protected internal The type or member can be accessed by any code in the assembly in which it is declared, or from within a derived class in another assembly.

private protected Il tipo o il membro è accessibile solo dall'interno dell'assembly in cui viene dichiarato, dal codice nella stessa classe o in un tipo derivato da tale classe.private protected The type or member can be accessed only within its declaring assembly, by code in the same class or in a type that is derived from that class.

L'esempio seguente illustra come specificare i modificatori di accesso in un tipo e in un membro:The following examples demonstrate how to specify access modifiers on a type and member:

public class Bicycle
{
    public void Pedal() { }
}

Non tutti i modificatori di accesso possono essere usati da tutti i tipi o membri in tutti i contesti e in alcuni casi l'accessibilità di un membro del tipo è vincolato all'accessibilità del tipo contenitore.Not all access modifiers can be used by all types or members in all contexts, and in some cases the accessibility of a type member is constrained by the accessibility of its containing type. Le sezioni seguenti offrono altre informazioni dettagliate sull'accessibilità.The following sections provide more details about accessibility.

Accessibilità di classi e structClass and Struct Accessibility

Le classi e gli struct dichiarati direttamente all'interno di uno spazio dei nomi (in altre parole, che non sono annidati all'interno di altre classi o struct) possono essere public o internal.Classes and structs that are declared directly within a namespace (in other words, that are not nested within other classes or structs) can be either public or internal. Internal è l'opzione predefinita se non viene specificato nessun modificatore di accesso.Internal is the default if no access modifier is specified.

I membri struct, incluse le classi e gli struct annidati, possono essere dichiarati come public, internal o private.Struct members, including nested classes and structs, can be declared as public, internal, or private. I membri struct, incluse le classi e gli struct annidati, possono essere public, protected internal, protected, internal, private protected o private.Class members, including nested classes and structs, can be public, protected internal, protected, internal, private protected or private. Il livello di accesso per i membri di classe e per i membri struct, incluse le classi e gli struct annidati, è private per impostazione predefinita.The access level for class members and struct members, including nested classes and structs, is private by default. I tipi annidati private non sono accessibili all'esterno del tipo contenitore.Private nested types are not accessible from outside the containing type.

Le classi derivate non possono avere un'accessibilità maggiore di quella dei tipi di base.Derived classes cannot have greater accessibility than their base types. In altre parole, non è possibile avere una classe B public che deriva da una classe A internal.In other words, you cannot have a public class B that derives from an internal class A. Se questo fosse consentito, avrebbe l'effetto di rendere A pubblic, perché tutti i membri protected e internal di A sarebbero accessibili dalla classe derivata.If this were allowed, it would have the effect of making A public, because all protected or internal members of A are accessible from the derived class.

È possibile abilitare altri assembly specifici per accedere ai tipi internal usando InternalsVisibleToAttribute.You can enable specific other assemblies to access your internal types by using the InternalsVisibleToAttribute. Per altre informazioni, vedere Friend Assemblies (Assembly friend).For more information, see Friend Assemblies.

Accessibilità dei membri struct e di classeClass and Struct Member Accessibility

I membri di classe (inclusi le classi e gli struct annidati) possono essere dichiarati con uno qualsiasi dei sei tipi di accesso.Class members (including nested classes and structs) can be declared with any of the six types of access. I membri struct non possono essere dichiarati protected perché struct non supporta l'ereditarietà.Struct members cannot be declared as protected because structs do not support inheritance.

In genere l'accessibilità di un membro non è maggiore dell'accessibilità del tipo contenitore.Normally, the accessibility of a member is not greater than the accessibility of the type that contains it. Un membro public di una classe internal potrebbe tuttavia essere accessibile dall'esterno dell'assembly se il membro implementa metodi di interfaccia o esegue l'override di metodi virtuali definiti in una classe di base public.However, a public member of an internal class might be accessible from outside the assembly if the member implements interface methods or overrides virtual methods that are defined in a public base class.

Il tipo di qualsiasi membro che è un campo, proprietà o evento deve essere accessibile almeno quanto il membro stesso.The type of any member that is a field, property, or event must be at least as accessible as the member itself. Analogamente, il tipo restituito e i tipi di parametri di qualsiasi membro, che è un metodo, indicizzatore o delegato, devono essere accessibili almeno quanto il membro stesso.Similarly, the return type and the parameter types of any member that is a method, indexer, or delegate must be at least as accessible as the member itself. Ad esempio, non è possibile avere un metodo M public che restituisce una classe C a meno che C non sia anche public.For example, you cannot have a public method M that returns a class C unless C is also public. Analogamente, non è possibile avere una proprietà protected di tipo A se A è dichiarato come private.Likewise, you cannot have a protected property of type A if A is declared as private.

Gli operatori definiti dall'utente devono sempre essere dichiarati come public e static.User-defined operators must always be declared as public and static. Per altre informazioni, vedere Overload degli operatori.For more information, see Operator overloading.

I finalizzatori non possono avere modificatori di accessibilità.Finalizers cannot have accessibility modifiers.

Per impostare il livello di accesso per un membro struct o di classe, aggiungere la parola chiave appropriata alla dichiarazione del membro, come illustrato nell'esempio seguente.To set the access level for a class or struct member, add the appropriate keyword to the member declaration, as shown in the following example.

// public class:
public class Tricycle
{
    // protected method:
    protected void Pedal() { }

    // private field:
    private int wheels = 3;

    // protected internal property:
    protected internal int Wheels
    {
        get { return wheels; }
    }
}

Nota

Il livello di accessibilità protected internal significa protected O internal, ma non protected E internal.The protected internal accessibility level means protected OR internal, not protected AND internal. In altre parole, un membro protected internal è accessibile da qualsiasi classe dello stesso assembly, incluse le classi derivate.In other words, a protected internal member can be accessed from any class in the same assembly, including derived classes. Per limitare l'accessibilità solo alle classi derivate dello stesso assembly, dichiarare la classe stessa come internal e dichiarare i relativi membri come protected.To limit accessibility to only derived classes in the same assembly, declare the class itself internal, and declare its members as protected. A partire da C# 7.2, è anche possibile usare il modificatore di accesso private protected per ottenere lo stesso risultato senza dover impostare come interna la classe che lo contiene.Also, starting with C# 7.2, you can use the private protected access modifier to achieve the same result without need to make the containing class internal.

Altri tipiOther Types

Le interfacce dichiarate direttamente all'interno di uno spazio dei nomi possono essere dichiarate come public o internal e, analogamente a classi e struct, le interfacce vengono impostate a accesso internal.Interfaces declared directly within a namespace can be declared as public or internal and, just like classes and structs, interfaces default to internal access. I membri di interfaccia sono sempre public poiché lo scopo di un'interfaccia è abilitare altri tipi ad accedere a una classe o struct.Interface members are always public because the purpose of an interface is to enable other types to access a class or struct. Nessun modificatore di accesso può essere applicato ai membri di interfaccia.No access modifiers can be applied to interface members.

I membri di enumerazione sono sempre public e non può essere applicato nessun modificatore di accesso.Enumeration members are always public, and no access modifiers can be applied.

I delegati si comportano come classi e struct.Delegates behave like classes and structs. Per impostazione predefinita, hanno accesso internal quando dichiarati direttamente all'interno di uno spazio dei nomi e accesso private se annidati.By default, they have internal access when declared directly within a namespace, and private access when nested.

Specifiche del linguaggio C#C# Language Specification

Per altre informazioni, vedere la specifica del linguaggio C#.For more information, see the C# Language Specification. La specifica del linguaggio costituisce il riferimento ufficiale principale per la sintassi e l'uso di C#.The language specification is the definitive source for C# syntax and usage.

Vedere ancheSee also