Compartilhar via


Design de campo

Campos mantêm os dados associados a um objeto. Na grande maioria dos cenários de qualquer campo não estático em uma biblioteca não deve ser visível para os desenvolvedores. As diretrizes a seguir o ajudarão a usar corretamente a campos em seu projeto de biblioteca.

Não fornecem os campos de instância público ou protegido.

Campos Public e protected fazer não versão bem e não são protegidos por demandas de segurança de acesso do código. Em vez de usar campos publicamente visíveis, use os campos particulares e expô-los por meio de propriedades.

Use campos constantes para constantes que nunca serão alteradas.

Por exemplo, o Math define a classe E e PI como constantes estáticas.

O compilador insere os valores de const campos diretamente o código de chamada, que significa que const valores nunca podem ser alterados sem o risco de introduzir um problema de compatibilidade.

Use campos somente leitura estáticos públicos para instâncias de objeto predefinido.

Por exemplo, o DateTime classe fornece campos somente leitura estáticos que você pode usar para obter DateTime o conjunto de objetos para o valor de tempo máximo ou mínimo. Consulte MaxValue e MinValue.

Não atribua instâncias de tipos mutáveis para campos somente leitura.

Objetos criados usando um tipo mutável podem ser modificados depois que forem criados. Por exemplo, arrays e a maioria das coleções são tipos mutáveis enquanto Int32, Uri, e String são tipos imutáveis. Para campos que contêm um tipo de referência mutáveis, o modificador de somente leitura impede que o valor do campo que está sendo substituído, mas não protege o tipo mutável contra modificação.

O exemplo de código a seguir demonstra o problema com o uso de campos somente leitura. O BadDesign cria um campo somente leitura e a classe expõe usando uma propriedade somente leitura. Isso não impede que o ShowBadDesign classe modifiquem o conteúdo do campo somente leitura.

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. Todos os direitos reservados.

Portions Copyright Addison-Wesley Corporation. Todos os direitos reservados.

Para obter mais informações sobre as diretrizes de design, consulte a "diretrizes de Design do Framework: Convenções, idiomas e padrões de reutilizável.Bibliotecas de rede" catálogo por Krzysztof Cwalina e Brad Abrams, publicado pela Addison-Wesley, 2005.

Consulte também

Outros recursos

Diretrizes de Design do membro

Diretrizes de Design para desenvolvimento bibliotecas de classe