Condividi tramite


Progettazione di campi

I campi contengono dati associati a un oggetto. Nella maggior parte degli scenari i campi non statici all'interno di una libreria non devono essere visibili agli sviluppatori. Le linee guida riportate di seguito consentono il corretto utilizzo dei campi nella progettazione di librerie.

Non fornire campi di istanza pubblici o protetti.

I campi pubblici e i campi protetti non sempre possono essere utilizzati in versioni differenti e non sono protetti da eventuali richieste di sicurezza per l'accesso al codice. Anziché utilizzare campi visibili pubblicamente, utilizzare campi privati ed esporli mediante proprietà.

Utilizzare campi di costante per costanti che non verranno mai modificate.

La classe Math, ad esempio, definisce E e PI come costanti statiche.

Il compilatore inserisce i valori dei campi const direttamente nel codice chiamante. Ciò significa che i valori const non possono essere mai modificati senza il rischio di introdurre un problema di compatibilità.

Per le istanze di oggetti predefinite utilizzare campi di sola lettura statici pubblici.

La classe DateTime, ad esempio, fornisce campi di sola lettura statici che possono essere utilizzati per ottenere oggetti DateTime impostati sul valore di ora massimo o minimo. Vedere MaxValue e MinValue.

Non assegnare istanze di tipi modificabili a campi di sola lettura.

Gli oggetti creati utilizzando un tipo modificabile possono essere modificati. Le matrici e la maggior parte degli insiemi, ad esempio, sono tipi modificabili, mentre Int32, Uri e String sono tipi non modificabili. Per i campi che contengono un tipo di riferimento modificabile, il modificatore di sola lettura impedisce la sovrascrittura del valore del campo, ma non impedisce la modifica del tipo modificabile.

Nell'esempio di codice riportato di seguito viene illustrato il problema relativo all'utilizzo di campi di sola lettura. La classe BadDesign crea un campo di sola lettura e lo espone utilizzando una proprietà di sola lettura. Questo non impedisce alla classe ShowBadDesign di modificare il contenuto del campo di sola lettura.

Imports System

Namespace Examples.DesignGuidelines.Fields

    Public Class BadDesign

        Public Readonly dataValues as Integer() = {1,2,3}

        Public ReadOnly Property Data as Integer ()

            Get 
                Return dataValues
            End Get
        End Property

        Public Sub WriteData()

            For Each i as Integer In dataValues

                Console.Write ("{0} ", i)
            Next i
            Console.WriteLine()
        End Sub
    End Class

    Public Class ShowBadDesign

        Public Shared Sub Main()

            Dim bad as BadDesign = new BadDesign()
            ' The following line will write: 1 2 3
            bad.WriteData()

            Dim badData as Integer() = bad.Data
            For i as Integer  = 0 To badData.Length -1

                badData(i) = 0
            Next i

            ' The following line will write: 0 0 0
            ' because bad's data has been modified.
            bad.WriteData()
        End Sub
    End Class
End Namespace
using System;

namespace Examples.DesignGuidelines.Fields
{
    public class BadDesign
    {
        public readonly int[] data = {1,2,3};

        public int [] Data
        {
            get {return data;}
        }
        public void WriteData()
        {
            foreach (int i in data)
            {
                Console.Write ("{0} ", i);
            }
            Console.WriteLine();
        }
    }
    public class ShowBadDesign
    {
        public static void Main()
        {
            BadDesign bad = new BadDesign();
            // The following line will write: 1 2 3
            bad.WriteData();

            int[] badData = bad.Data;
            for (int i = 0; i< badData.Length; i++)
            {
                badData[i] = 0;
            }
            // The following line will write: 0 0 0
            // because bad's data has been modified.
            bad.WriteData();
        }
    }
}
using namespace System;

namespace Examples { namespace DesignGuidelines { namespace Fields
{
    public ref class BadDesign
    {
    public:
        static const array<int>^ data = {1,2,3};

        property array<int>^ Data
        {
            array<int>^ get() {return data;}
        }

        void WriteData()
        {
            for each (int i in data)
            {
                Console::Write ("{0} ", i);
            }
            Console::WriteLine();
        }
    };

    public ref class ShowBadDesign
    {
    public:
        static void Main()
        {
            BadDesign^ bad = gcnew BadDesign();
            // The following line will write: 1 2 3
            bad->WriteData();

            array<int>^ badData = bad->Data;
            for (int i = 0; i< badData->Length; i++)
            {
                badData[i] = 0;
            }
            // The following line will write: 0 0 0
            // because bad's data has been modified.
            bad->WriteData();
        }
    };
}}}

Portions Copyright 2005 Microsoft Corporation. Tutti i diritti riservati.

Portions Copyright Addison-Wesley Corporation. Tutti i diritti riservati.

Per ulteriori informazioni sulle linee guida di progettazione, vedere “le linee guida di progettazione di Framework: Idiomi convenzioni, e modelli per libro raccolte riutilizzabili .NET„ di Krzysztof Cwalina e brad Abrams, emessi da Addison-Wesley, 2005.

Vedere anche

Altre risorse

Linee guida di progettazione dei membri

Linee guida di progettazione per lo sviluppo di librerie di classi