¿Le resultó útil esta página?
Sus comentarios sobre este contenido son muy importantes. Háganos saber su opinión.
¿Tiene comentarios adicionales?
Caracteres restantes: 1500
Exportar (0) Imprimir
Expandir todo
Este artículo se tradujo de forma manual. Mueva el puntero sobre las frases del artículo para ver el texto original.
Traducción
Original

Diseño de estructuras

Las estructuras son tipos de valor. Se asignan en la pila o en línea y se desasignan cuando salen del ámbito. En general, cuesta menos asignar o desasignar los tipos de valor; sin embargo, si se utilizan en escenarios que requieren una cantidad significativa de conversiones boxing y unboxing, su rendimiento es deficiente en comparación con los tipos de referencia. Para obtener más información, vea Conversión boxing y unboxing (Guía de programación de C#).

Para obtener información adicional sobre los tipos de valor y los tipos de referencia, vea Sistema de tipos comunes.

No proporcione un constructor predeterminado para una estructura.

Si una estructura define un constructor predeterminado, cuando se crean matrices de la estructura, Common Language Runtime ejecuta automáticamente el constructor predeterminado en cada uno de los elementos de la matriz.

Algunos compiladores, como el compilador de C#, no permiten que las estructuras tengan constructores predeterminados.

Implemente System.IEquatable`1 en los tipos de valor.

Se prefiere utilizar IEquatable<T> frente a Equals para determinar si dos tipos de valor son iguales. Utilizando la interfaz, el llamador evita el impacto negativo en el rendimiento que conlleva la aplicación de la conversión boxing y la reflexión administrada.

Asegúrese de que es válido un estado donde todos los datos de instancia están establecidos en cero, false o null (según corresponda).

Siguiendo esta instrucción, las instancias del tipo de valor construidas desde cero no quedan en un estado inutilizable. Por ejemplo, la estructura siguiente está incorrectamente diseñada. Se supone que el constructor con parámetros garantiza un estado válido, pero no se ejecuta el constructor cuando se crea una matriz de la estructura. Esto significa que el campo de instancia label se inicializa en null (Nothing en Visual Basic), que no es válido para la implementación de esta estructura de ToString.


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);
    }
}


En el ejemplo de código siguiente, el diseño de GoodStructure no presupone el estado del campo label. El método ToString está diseñado para controlar una etiqueta null.


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);
    }
}



No extienda explícitamente System.ValueType.

Algunos compiladores no permiten extender ValueType.

Portions Copyright 2005 Microsoft Corporation. Reservados todos los derechos.

Portions Copyright Addison-Wesley Corporation. Reservados todos los derechos.

Para obtener más información sobre las directrices de diseño, consulte “las instrucciones de diseño de Framework: Convenciones, frases realizadas y modelos para libro de bibliotecas reutilizables de .NET” de Krzysztof Cwalina y Brad Abrams, publicados por Addison-Wesley, 2005.

Adiciones de comunidad

AGREGAR
Mostrar:
© 2015 Microsoft