Design da estrutura
Estruturas são tipos de valor. Eles são alocados na pilha ou in-line e são desalocados saem do escopo. Em geral, os tipos de valor são mais baratos alocar e desalocar; No entanto, se forem usados em cenários que exigem uma quantidade significativa de boxing e unboxing, eles insatisfatório em relação aos tipos de referência. Para obter mais informações, consulte Boxing e Unboxing (TRANSLATION FROM VPE FOR CSHARP guia de programação).
Para obter informações adicionais sobre os tipos de valor e tipos de referência, consulte o Common Type System.
Não fornece um construtor padrão para uma estrutura.
Se uma estrutura define um construtor padrão, quando os arrays da estrutura são criados, o common language runtime executa automaticamente o construtor padrão em cada elemento da matriz.
Alguns compiladores, como, por exemplo, o compilador C#, não permitir que estruturas ter construtores padrão.
Implemente System.IEquatable'1 em tipos de valor.
IEquatable<T>é preferível sobre Equals para determinar se são dois tipos de valor igual. Usando a interface, o chamador evita o impacto de desempenho negativo de reflexão de boxing e gerenciado.
Certifique-se que um estado onde todos os dados de instância é definido como zero, falso ou nulo (conforme apropriado) é válido.
Seguindo essa diretriz, suas instâncias do tipo de valor construído recentemente não são deixadas em um estado inutilizável. Por exemplo, a seguinte estrutura incorretamente foi projetada. O construtor parametrizado destina-se a garantir um estado válido, mas o construtor não é executado quando uma matriz da estrutura é criada. Isso significa que o campo de instância label é inicializado para null (Nothing em Visual Basic), que não é válido para a implementação da estrutura de ToString.
Public Structure BadStructure
Private label As String
Private width As Integer
Private length As Integer
Public Sub New(ByVal labelValue As String, ByVal widthValue As Integer, ByVal lengthValue As Integer)
If ((labelValue = Nothing) _
OrElse (labelValue.Length = 0)) Then
Throw New ArgumentNullException("label")
End If
label = labelValue
width = widthValue
length = lengthValue
End Sub
Public Overrides Function ToString() As String
' Accessing label.Length throws a NullReferenceException
' when label is null.
Return String.Format("Label length: {0} Label: {1} Width: {2} Length: {3}", label.Length, label, width, length)
End Function
End Structure
public struct BadStructure
{
string label;
int width;
int length;
public BadStructure (string labelValue, int widthValue, int lengthValue)
{
if (labelValue == null || labelValue.Length ==0)
{
throw new ArgumentNullException("label");
}
label = labelValue;
width = widthValue;
length = lengthValue;
}
public override string ToString()
{
// Accessing label.Length throws a NullReferenceException
// when label is null.
return String.Format("Label length: {0} Label: {1} Width: {2} Length: {3}",
label.Length, label, width,length);
}
}
No seguinte exemplo de código, o design de GoodStructure faz suposições sobre o estado da label campo. O ToString método foi projetado para lidar com um null rótulo.
Public Structure GoodStructure
Private label As String
Private width As Integer
Private length As Integer
Public Sub New(ByVal labelValue As String, ByVal widthValue As Integer, ByVal lengthValue As Integer)
label = labelValue
width = widthValue
length = lengthValue
End Sub
Public Overrides Function ToString() As String
' Handle the case where label might be
' initialized to null;
Dim formattedLabel As String = label
Dim formattedLableLength As Integer
If (formattedLabel = Nothing) Then
formattedLabel = "<no label value specified>"
formattedLableLength = 0
Else
formattedLableLength = label.Length
End If
Return String.Format("Label Length: {0} Label: {1} Width: {2} Length: {3}", formattedLableLength, formattedLabel, width, length)
End Function
End Structure
public struct GoodStructure
{
string label;
int width;
int length;
public GoodStructure (string labelValue, int widthValue, int lengthValue)
{
label = labelValue;
width = widthValue;
length = lengthValue;
}
public override string ToString()
{
// Handle the case where label might be
// initialized to null;
string formattedLabel = label;
int formattedLableLength;
if (formattedLabel == null)
{
formattedLabel = "<no label value specified>";
formattedLableLength = 0;
} else
{
formattedLableLength = label.Length;
}
return String.Format("Label Length: {0} Label: {1} Width: {2} Length: {3}",
formattedLableLength, formattedLabel, width, length);
}
}
Explicitamente não estenda System. ValueType.
Alguns compiladores não permitem estender ValueType.
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
Conceitos
Escolhendo entre Classes e estruturas
Outros recursos
Diretrizes de Design para desenvolvimento bibliotecas de classe