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