Compartilhar via


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 do tipo

Diretrizes de Design para desenvolvimento bibliotecas de classe