Design de campo
Campos Isenção dados associados a um objeto. Na grande maioria dos cenários de quaisquer campos não-estático em uma biblioteca não devem ser visíveis para os desenvolvedores. As seguintes diretrizes ajudar corretamente usar os campos em seu projeto de biblioteca.
Não fornecem os campos de instância público ou protegido.
Campos públicos e protegidos 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 visíveis publicamente, use campos particulares e expô-los por meio de propriedades.
Use campos constante para constante nunca serão alterado.
Por exemplo, a Math classe define E e PI sistema autônomo constantes estáticas.
O compilador insere os valores de const campos diretamente no 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ático públicos para instâncias de objeto predefinido.
Por exemplo, a DateTime classe fornece campos somente leitura estático que você pode usar para obter DateTime objetos definido como o valor temporal máximo ou mínimo. Consulte MaxValue e MinValue.
Não atribua instâncias de tipos mutáveis campos somente leitura.
Os objetos criados usando um tipo mutável podem ser modificados depois que são criados. Por exemplo, arrays e a maioria das coleções são tipos mutáveis durante Int32, Uri, e String são tipos imutáveis. Para campos que armazenam um tipo de referência mutáveis, o modificador somente leitura impede que o valor do campo sejam sobrescritos mas não protege tipo mutável contra modificações.
O exemplo de código a seguir demonstra o problema com o uso de campos somente leitura. The BadDesign classe cria um campo somente leitura e a expõe usando uma propriedade somente leitura. Isso não impede que o ShowBadDesign classe de modificar o Sumário 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();
}
}
}
Partes direitos autorais 2005 Microsoft Corporation. Todos os direitos reservados.
Partes direitos autorais Addison-Wesley Corporation. Todos os direitos reservados.
Para obter mais informações sobre diretrizes de design, consulte a "diretrizes de design do estrutura: Catálogo de convenções, idiomas e padrões para bibliotecas do .NET reutilizável"Krzysztof Cwalina e Brad Abrams, publicado pela Addison-Wesley, 2005.
Consulte também
Outros recursos
Diretrizes de design de membro
Diretrizes de Design para desenvolvimento bibliotecas de classe