Compartir a través de


Instrucciones de uso de tipos de valor

Un tipo de valor describe un valor que se representa como una secuencia de bits almacenada en la pila. Para obtener una descripción de todos los tipos de datos integrados de .NET Framework, vea Tipos de valor. En esta sección se proporcionan las instrucciones de uso de tipos de valor de enumeraciones (enum) y de estructuras (struct).

Instrucciones de uso de estructuras

Se recomienda utilizar un valor struct para los tipos que cumplan los siguientes criterios:

  • Actúan como tipos primitivos.
  • Tienen un tamaño de instancia inferior a 16 bytes.
  • Son inmutables.
  • Es conveniente utilizar la semántica de valor.

En el siguiente ejemplo se muestra una estructura definida correctamente.

Public Structure Int32 
   Implements IFormattable 
   Implements IComparable
   Public Const MinValue As Integer = -2147483648
   Public Const MaxValue As Integer = 2147483647
   
   Private intValue As Integer

   Overloads Public Shared Function ToString(i As Integer) As String
      ' Insert code here.
   End Function 
   
   Overloads Public Function ToString(ByVal format As String, ByVal 
         formatProvider As IFormatProvider) As String Implements  
         IFormattable.ToString
      ' Insert code here.
   End Function 
   
   Overloads Public Overrides Function ToString() As String
      ' Insert code here.
   End Function 
   Public Shared Function Parse(s As String) As Integer
      ' Insert code here.
      Return 0
   End Function
   
   Public Overrides Function GetHashCode() As Integer
      ' Insert code here.
      Return 0
   End Function 
   
   Public Overrides Overloads Function Equals(obj As Object) As Boolean 
      ' Insert code here.
      Return False
   End Function 
   
   Public Function CompareTo(obj As Object) As Integer Implements 
         IComparable.CompareTo
      ' Insert code here.
      Return 0
   End Function 
End Structure 
[C#]
public struct Int32: IComparable, IFormattable
{ 
   public const int MinValue = -2147483648;
   public const int MaxValue = 2147483647;
   
   public static string ToString(int i) 
   {
      // Insert code here.
   }

   public string ToString(string format, IFormatProvider formatProvider) 
   {
      // Insert code here.
   }

   public override string ToString() 
   {
      // Insert code here.
   }

   public static int Parse(string s)
   {
      // Insert code here.
      return 0;
   }

   public override int GetHashCode()
   {
      // Insert code here.
      return 0;
   }

   public override bool Equals(object obj)
   {
      // Insert code here.
      return false;
   }

   public int CompareTo(object obj)
   {
      // Insert code here.
      return 0;
   }

}
  • No incluya un constructor predeterminado para struct. Tenga en cuenta que C# no admite que struct tenga un constructor predeterminado. El motor en tiempo de ejecución inserta un constructor que inicializa todos los valores en un estado cero. Esto permite crear matrices de estructuras sin ejecutar el constructor en cada instancia. No haga que una estructura struct dependa de un constructor que se invoque para cada instancia. Las instancias de estructuras se pueden crear con un valor de cero sin ejecutar un constructor. También se debe diseñar una estructura struct para un estado en el que todos los datos de instancias se establezcan en cero, false o null (según corresponda) para que sean válidos.

Instrucciones de uso de enumeraciones

En las reglas siguientes se describen las pautas de uso de enumeraciones:

  • No utilice el sufijo Enum en tipos enum.

  • Utilice un tipo de valor enum para escribir tipos devueltos, parámetros, propiedades seguros. Defina siempre los valores enumerados que se utilizan en parámetros y propiedades mediante el tipo enum. De este modo, las herramientas de desarrollo conocen los valores posibles de una propiedad o parámetro. En el ejemplo siguiente se muestra cómo definir un tipo enum.

    Public Enum FileMode
       Append
       Create
       CreateNew
       Open
       OpenOrCreate
       Truncate
    End Enum
    [C#]
    public enum FileMode
    {
       Append,
       Create,
       CreateNew,
       Open,
       OpenOrCreate,
       Truncate
    }
    

    En el ejemplo siguiente se muestra el constructor de un objeto FileStream que utiliza la enumeración FileMode.

    Public Sub New(ByVal path As String, ByVal mode As FileMode);
    [C#]
    public FileStream(string path, FileMode mode);
    
  • Utilice un tipo de valor enum en vez de constantes estáticas finales.

  • No utilice un tipo de valor enum en conjuntos abiertos (como la versión del sistema operativo).

  • Utilice la Clase System.FlagsAttribute para crear atributos personalizados para un tipo de valor enum sólo si se realiza una operación OR bit a bit en valores numéricos. Use potencias de dos para los valores de enum de forma que puedan combinarse con facilidad. Este atributo se aplica en el siguiente ejemplo de código.

    <Flags()>
    Public Enum WatcherChangeTypes
       Created = 1
       Deleted = 2
       Changed = 4
       Renamed = 8
       All = Created Or Deleted Or Changed Or Renamed
    End Enum 
    [C#]
    [Flags()]
    public enum WatcherChangeTypes
    {
       Created = 1,
       Deleted = 2,
       Changed = 4,
       Renamed = 8,
       All = Created | Deleted | Changed | Renamed
    };
    

    **Nota   **Una excepción a esta regla es la encapsulación de una API de Win32. Normalmente, se utilizan definiciones internas que vienen en un encabezado Win32. Se pueden dejar estas definiciones con las mayúsculas y minúsculas de Win32 que, por lo general, están todas las letras en mayúsculas.

  • Considere proporcionar constantes con nombre para las combinaciones de indicadores usadas con frecuencia. Usar una operación OR bit a bit es un concepto avanzado y no debería requerirse para tareas sencillas. Esto se muestra en el siguiente ejemplo de enumeración:

    <Flags()> _
    Public Enum FileAccess
       Read = 1
       Write = 2
       ReadWrite = Read Or Write
    End Enum 
    [C#]
    [Flags()]
    public enum FileAccess
    {
       Read = 1,
       Write = 2,
       ReadWrite = Read | Write,
    }
    
  • Utilice el tipo Int32 como el tipo subyacente de un tipo de valor enum salvo que se cumpla una de las siguiente condiciones:

    • El tipo de valor enum representa indicadores y hay ya más de 32 indicadores; o el tipo de valor enum podría tener muchos indicadores en el futuro.
    • El tipo debe ser diferente de int para que sea compatible con versiones anteriores.
  • Tenga en cuenta que los argumentos enum no siempre se encuentran en el intervalo definido. Resulta válido convertir cualquier valor entero al tipo enum aunque el valor no esté definido en el tipo enum. Realice una validación de argumentos cómo se muestra en el siguiente ejemplo de código.

    Public Sub SetColor(newColor As Color)
       If Not [Enum].IsDefined(GetType(Color), newColor) Then
          Throw New ArgumentOutOfRangeException()
       End If 
    End Sub
    [C#]
    public void SetColor (Color color)
    {
       if (!Enum.IsDefined (typeof(Color), color) 
          throw new ArgumentOutOfRangeException();
    }
    

Vea también

Instrucciones de diseño para programadores de bibliotecas de clases | Instrucciones de nomenclatura de tipos de enumeración | Tipos de valor | Enumeraciones