Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Impara Modificatori di Accesso Comuni | Fondamenti Di OOP
C# Oltre le Basi

bookModificatori di Accesso Comuni

Potresti già conoscere la parola chiave public. Si tratta di un modificatore di accesso che definisce da dove è possibile accedere a una determinata classe, metodo o campo.

Allo stesso modo, esistono termini come private e protected. Entrambi questi termini possono essere utilizzati per specificare l'accessibilità di un metodo o di un campo.

Quando si scrive public davanti a una classe, si rende semplicemente la classe accessibile da diverse parti (file) del programma. Non è necessario approfondire questo aspetto, poiché è fuori dall'ambito di questo capitolo.

Quando si specifica un metodo o un campo come public, si rende fondamentalmente quella proprietà della classe accessibile da qualsiasi punto del codice tramite un oggetto:

index.cs

index.cs

copy
1234567891011121314151617181920212223
using System; public class Point { public int x; public int y; public Point(int x, int y) { this.x = x; this.y = y; } } class ConsoleApp { static void Main() { Point p = new Point(7, 9); // We can directly access 'public' fields of an object using the dot '.' symbol Console.WriteLine(p.x); Console.WriteLine(p.y); } }

Se non si desidera che un campo o un metodo di un oggetto sia accessibile dall'esterno della classe, è sufficiente renderlo private:

index.cs

index.cs

copy
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748
using System; class Point { public int x; public int y; private double magnitude; public Point(int x, int y) { this.x = x; this.y = y; this.magnitude = calculateMagnitude(); } // A private method can only be used inside the class. // Trying to use a private method outside the class might result in a compilation error. private double calculateMagnitude() { // Math.Sqrt() is the square root function. return Math.Sqrt(x * x + y * y); } // Sometimes, to be able to access data from a private field, we make public methods // which specifically retrieve the value of that field. Such methods are called "getters", // and such fields are called "read-only" fields as we can access their data but cannot modify it from outside the class. public double getMagnitude() { return magnitude; } } class ConsoleApp { static void Main() { Point p = new Point(7, 9); // Correct Console.WriteLine(p.getMagnitude()); // Error Console.WriteLine(p.calculateMagnitude()); // Error Console.WriteLine(p.magnitude); } }

È importante notare che i campi e i metodi privati non vengono ereditati dalle classi derivate:

index.cs

index.cs

copy
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253
using System; class Point { public int x; public int y; private double magnitude; public Point(int x, int y) { this.x = x; this.y = y; this.magnitude = calculateMagnitude(); } private double calculateMagnitude() { // Math.Sqrt() is the square root function. return Math.Sqrt(x * x + y * y); } public double getMagnitude() { return magnitude; } } class Point3D : Point { public int z; // The 'base(x, y)' part simply calls the constructor of the 'Point' class with 'x' and 'y' values. // This will be more thoroughly explained in the later section. public Point3D(int x, int y, int z) : base(x, y) { this.z = z; // Error calculateMagnitude(); } } class ConsoleApp { static void Main() { Point3D p = new Point3D(5, 7, 9); // Correct according to rules of language, however note that it will give the magnitude of x and y excluding z (for a 2D point) so logically the result will be wrong Console.WriteLine(p.getMagnitude()); } }

Per rendere un campo o un metodo inaccessibile dall'esterno della classe ma accessibile dalle classi derivate, è possibile utilizzare la parola chiave protected:

index.cs

index.cs

copy
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950
using System; class Point { public int x; public int y; protected double magnitude; public Point(int x, int y) { this.x = x; this.y = y; this.magnitude = calculateMagnitude(); } protected double calculateMagnitude() { // Math.Sqrt() is the squareroot function. return Math.Sqrt(x * x + y * y); } public double getMagnitude() { return magnitude; } } class Point3D : Point { public int z; public Point3D(int x, int y, int z) : base(x, y) { this.z = z; // No Error Now calculateMagnitude(); } } class ConsoleApp { static void Main() { Point3D p = new Point3D(5, 7, 9); Console.WriteLine(p.getMagnitude()); } }

A volte, per poter accedere ad attributi privati di una classe, si creano metodi pubblici chiamati getter. Il metodo getMagnitude è un esempio di getter. Questo garantisce che il campo sia solo leggibile e non modificabile, rendendo quell'attributo sola lettura.

Note
Nota

Se non viene specificato alcun modificatore di accesso per un membro di classe, per impostazione predefinita viene considerato private.

1. Quale modificatore di accesso consente a un membro di essere accessibile solo all'interno della propria classe?

2. Come rendere un attributo di classe inaccessibile dall'esterno?

3. Qual è un buon modo per accedere ai valori dei campi privati dall'esterno della classe?

question mark

Quale modificatore di accesso consente a un membro di essere accessibile solo all'interno della propria classe?

Select the correct answer

question mark

Come rendere un attributo di classe inaccessibile dall'esterno?

Select the correct answer

question mark

Qual è un buon modo per accedere ai valori dei campi privati dall'esterno della classe?

Select the correct answer

Tutto è chiaro?

Come possiamo migliorarlo?

Grazie per i tuoi commenti!

Sezione 4. Capitolo 3

Chieda ad AI

expand

Chieda ad AI

ChatGPT

Chieda pure quello che desidera o provi una delle domande suggerite per iniziare la nostra conversazione

Awesome!

Completion rate improved to 2.04

bookModificatori di Accesso Comuni

Scorri per mostrare il menu

Potresti già conoscere la parola chiave public. Si tratta di un modificatore di accesso che definisce da dove è possibile accedere a una determinata classe, metodo o campo.

Allo stesso modo, esistono termini come private e protected. Entrambi questi termini possono essere utilizzati per specificare l'accessibilità di un metodo o di un campo.

Quando si scrive public davanti a una classe, si rende semplicemente la classe accessibile da diverse parti (file) del programma. Non è necessario approfondire questo aspetto, poiché è fuori dall'ambito di questo capitolo.

Quando si specifica un metodo o un campo come public, si rende fondamentalmente quella proprietà della classe accessibile da qualsiasi punto del codice tramite un oggetto:

index.cs

index.cs

copy
1234567891011121314151617181920212223
using System; public class Point { public int x; public int y; public Point(int x, int y) { this.x = x; this.y = y; } } class ConsoleApp { static void Main() { Point p = new Point(7, 9); // We can directly access 'public' fields of an object using the dot '.' symbol Console.WriteLine(p.x); Console.WriteLine(p.y); } }

Se non si desidera che un campo o un metodo di un oggetto sia accessibile dall'esterno della classe, è sufficiente renderlo private:

index.cs

index.cs

copy
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748
using System; class Point { public int x; public int y; private double magnitude; public Point(int x, int y) { this.x = x; this.y = y; this.magnitude = calculateMagnitude(); } // A private method can only be used inside the class. // Trying to use a private method outside the class might result in a compilation error. private double calculateMagnitude() { // Math.Sqrt() is the square root function. return Math.Sqrt(x * x + y * y); } // Sometimes, to be able to access data from a private field, we make public methods // which specifically retrieve the value of that field. Such methods are called "getters", // and such fields are called "read-only" fields as we can access their data but cannot modify it from outside the class. public double getMagnitude() { return magnitude; } } class ConsoleApp { static void Main() { Point p = new Point(7, 9); // Correct Console.WriteLine(p.getMagnitude()); // Error Console.WriteLine(p.calculateMagnitude()); // Error Console.WriteLine(p.magnitude); } }

È importante notare che i campi e i metodi privati non vengono ereditati dalle classi derivate:

index.cs

index.cs

copy
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253
using System; class Point { public int x; public int y; private double magnitude; public Point(int x, int y) { this.x = x; this.y = y; this.magnitude = calculateMagnitude(); } private double calculateMagnitude() { // Math.Sqrt() is the square root function. return Math.Sqrt(x * x + y * y); } public double getMagnitude() { return magnitude; } } class Point3D : Point { public int z; // The 'base(x, y)' part simply calls the constructor of the 'Point' class with 'x' and 'y' values. // This will be more thoroughly explained in the later section. public Point3D(int x, int y, int z) : base(x, y) { this.z = z; // Error calculateMagnitude(); } } class ConsoleApp { static void Main() { Point3D p = new Point3D(5, 7, 9); // Correct according to rules of language, however note that it will give the magnitude of x and y excluding z (for a 2D point) so logically the result will be wrong Console.WriteLine(p.getMagnitude()); } }

Per rendere un campo o un metodo inaccessibile dall'esterno della classe ma accessibile dalle classi derivate, è possibile utilizzare la parola chiave protected:

index.cs

index.cs

copy
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950
using System; class Point { public int x; public int y; protected double magnitude; public Point(int x, int y) { this.x = x; this.y = y; this.magnitude = calculateMagnitude(); } protected double calculateMagnitude() { // Math.Sqrt() is the squareroot function. return Math.Sqrt(x * x + y * y); } public double getMagnitude() { return magnitude; } } class Point3D : Point { public int z; public Point3D(int x, int y, int z) : base(x, y) { this.z = z; // No Error Now calculateMagnitude(); } } class ConsoleApp { static void Main() { Point3D p = new Point3D(5, 7, 9); Console.WriteLine(p.getMagnitude()); } }

A volte, per poter accedere ad attributi privati di una classe, si creano metodi pubblici chiamati getter. Il metodo getMagnitude è un esempio di getter. Questo garantisce che il campo sia solo leggibile e non modificabile, rendendo quell'attributo sola lettura.

Note
Nota

Se non viene specificato alcun modificatore di accesso per un membro di classe, per impostazione predefinita viene considerato private.

1. Quale modificatore di accesso consente a un membro di essere accessibile solo all'interno della propria classe?

2. Come rendere un attributo di classe inaccessibile dall'esterno?

3. Qual è un buon modo per accedere ai valori dei campi privati dall'esterno della classe?

question mark

Quale modificatore di accesso consente a un membro di essere accessibile solo all'interno della propria classe?

Select the correct answer

question mark

Come rendere un attributo di classe inaccessibile dall'esterno?

Select the correct answer

question mark

Qual è un buon modo per accedere ai valori dei campi privati dall'esterno della classe?

Select the correct answer

Tutto è chiaro?

Come possiamo migliorarlo?

Grazie per i tuoi commenti!

Sezione 4. Capitolo 3
some-alt