Partager via


Conception de champs

Mise à jour : novembre 2007

Les champs stockent les données associées à un objet. Dans la plupart des cas, aucun champ non statique d'une bibliothèque ne doit être visible aux développeurs. Les instructions suivantes vous aident à utiliser correctement les champs dans votre design de bibliothèque.

Ne fournissez pas des champs d'instance publics ou protégés.

Les champs publics et protégés peuvent provoquer des problèmes de compatibilité de versions et ne sont pas protégés par des demandes de sécurité d'accès du code. Au lieu d'utiliser des champs publiquement visibles, utilisez des champs privés et exposez-les par l'intermédiaire de propriétés.

Utilisez des champs constants pour les constantes qui ne varient jamais.

Par exemple, la classe Math définit E et PI comme des constantes statiques.

Le compilateur insère directement les valeurs des champs const dans le code appelant, ce qui signifie que les valeurs const ne peuvent jamais être modifiées sans qu'il y ait un risque d'introduire un problème de compatibilité.

Utilisez des champs statiques, publics et en lecture seule pour des instances d'objet prédéfinies.

Par exemple, la classe DateTime fournit des champs statiques en lecture seule que vous pouvez utiliser pour obtenir des objets DateTime affectés d'une valeur de date/heure maximale ou minimale. Consultez MaxValue et MinValue.

N'assignez pas des instances de types mutables à des champs en lecture seule.

Les objets créés à l'aide d'un type mutable peuvent être modifiés après leur création. Par exemple, les tableaux et la plupart des collections sont des types mutables à la différence des types Int32, Uri et String. Dans le cas de champs qui possèdent un type référence mutable, le modificateur en lecture seule empêche la substitution de la valeur du champ mais ne protège pas le type mutable d'une modification.

L'exemple de code suivant illustre le problème lié à l'utilisation de champs en lecture seule. La classe BadDesign crée un champ en lecture seule et l'expose à l'aide d'une propriété en lecture seule. Cela n'empêche pas la classe ShowBadDesign de modifier le contenu du champ en lecture seule.

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

Portions Copyright 2005 Microsoft Corporation. Tous droits réservés.

Portions Copyright Addison-Wesley Corporation. Tous droits réservés.

Pour plus d'informations sur les instructions de conception, consultez le livre « Framework Design Guidelines: Conventions, Idioms, and Patterns for Reusable .NET Libraries » de Krzysztof Cwalina et Brad Abrams, publié par Addison-Wesley, 2005.

Voir aussi

Autres ressources

Instructions de conception des membres

Instructions de conception pour le développement de bibliothèques de classes