Compartir a través de


Diseño de campos

Actualización: noviembre 2007

Los campos contienen datos asociados a un objeto. En la inmensa mayoría de los escenarios, cualquier campo no estático de una biblioteca no debería estar visible para los desarrolladores. Las instrucciones siguientes le ayudan a utilizar correctamente los campos en el diseño de su biblioteca.

No proporcione campos de instancia que sean públicos o protegidos.

Los campos públicos y protegidos no controlan bien las versiones y no están protegidos frente a demandas de seguridad de acceso a código. En lugar de utilizar campos públicamente visibles, utilice campos privados y expóngalos mediante propiedades.

Utilice campos constantes para las constantes que nunca vayan a cambiar.

Por ejemplo, la clase Math define E y PI como constantes estáticas.

El compilador inserta los valores de const directamente en el código llamador, lo que significa que los valores const no se pueden cambiar nunca sin correr el riesgo de introducir un problema de compatibilidad.

Utilice campos estáticos públicos de sólo lectura para las instancias de objetos predefinidas.

Por ejemplo, la clase DateTime proporciona campos estáticos de sólo lectura que se pueden utilizar para obtener objetos DateTime establecidos en el valor máximo o mínimo de fecha y hora. Vea MaxValue y MinValue.

No asigne instancias de tipos mutables a campos de sólo lectura.

Los objetos creados utilizando un tipo mutable se pueden modificar una vez creados. Por ejemplo, las matrices y la mayoría de las colecciones son tipos mutables, mientras que Int32, Uri y String son tipos inmutables. Para los campos que tienen un tipo de referencia mutable, el modificador de sólo lectura impide que se sobrescriba el valor del campo, pero no protege el tipo mutable ante modificaciones.

El ejemplo de código siguiente muestra el problema de utilizar campos de sólo lectura. La clase BadDesign crea un campo de sólo lectura y lo expone utilizando una propiedad de sólo lectura. Esto no evita que la clase ShowBadDesign modifique el contenido del campo de sólo lectura.

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. Reservados todos los derechos.

Portions Copyright Addison-Wesley Corporation. Reservados todos los derechos.

Para obtener más información sobre las directrices de diseño, consulte el libro titulado "Framework Design Guidelines: Conventions, Idioms, and Patterns for Reusable .NET Libraries" de Krzysztof Cwalina y Brad Abrams, publicado por Addison-Wesley, 2005.

Vea también

Otros recursos

Instrucciones de diseño de miembros

Instrucciones de diseño para desarrollar bibliotecas de clases