Questo articolo è stato tradotto automaticamente. Per visualizzare l'articolo in inglese, selezionare la casella di controllo Inglese. È possibile anche visualizzare il testo inglese in una finestra popup posizionando il puntatore del mouse sopra il testo.
Traduzione
Inglese

Classe ValueType

 

Data di pubblicazione: ottobre 2016

Fornisce la classe base per i tipi di valore.

Spazio dei nomi:   System
Assembly:  mscorlib (in mscorlib.dll)

System.Object
  System.ValueType
    System.Enum

[SerializableAttribute]
[ComVisibleAttribute(true)]
public abstract class ValueType

NomeDescrizione
System_CAPS_protmethodValueType()

Inizializza una nuova istanza della classe ValueType.

NomeDescrizione
System_CAPS_pubmethodEquals(Object)

Indica se questa istanza e un oggetto specificato sono uguali.(Esegue l'override di Object.Equals(Object).)

System_CAPS_protmethodFinalize()

Consente a un oggetto di provare a liberare risorse ed eseguire altre operazioni di pulizia prima che l'oggetto stesso venga reclamato dalla procedura di Garbage Collection. (Ereditato da Object.)

System_CAPS_pubmethodGetHashCode()

Restituisce il codice hash per questa istanza. (Esegue l'override di Object.GetHashCode().)

System_CAPS_pubmethodGetType()

Ottiene l'oggetto Type dell'istanza corrente.(Ereditato da Object.)

System_CAPS_protmethodMemberwiseClone()

Crea una copia superficiale dell'oggetto Object corrente.(Ereditato da Object.)

System_CAPS_pubmethodToString()

Restituisce il nome completo del tipo di questa istanza.(Esegue l'override di Object.ToString().)

ValueTypeesegue l'override dei metodi virtuali da Object con implementazioni più appropriate per i tipi di valore. Vedere anche Enum, che eredita da ValueType.

Tipi di dati vengono suddivisi in tipi di valore e tipi di riferimento. Tipi di valore vengono allocate nello stack o allocati inline in una struttura. Tipi di riferimento sono con allocazione heap. Tipi di riferimento e di valore derivano dalla classe base finale Object. In casi in cui è necessario che un tipo di valore si comporta come un oggetto, un wrapper che rende il tipo di valore come oggetto di riferimento viene allocato nell'heap e il valore del tipo di valore viene copiato. Il wrapper è contrassegnato affinché il sistema sappia che contiene un tipo di valore. Questo processo è noto come conversione boxing, e il processo è noto come conversione unboxing. Conversione boxing e unboxing consente qualsiasi tipo per essere considerato come un oggetto.

Sebbene ValueType è la classe base implicita per i tipi di valore, è possibile creare una classe che eredita da ValueType direttamente. Al contrario, fornire una parola chiave del linguaggio o a creare singoli compilatori (ad esempio struct in c# e Structure... End Structure in Visual Basic) per supportare la creazione di tipi di valore.

A parte che funge da classe base per tipi di valore in .NET Framework, il ValueType struttura in genere non viene utilizzata direttamente nel codice. Tuttavia, può essere utilizzato come parametro nelle chiamate al metodo per limitare i possibili argomenti di tipi di valore anziché tutti gli oggetti o per consentire a un metodo per gestire un numero di tipi di valore diverso. Nell'esempio seguente viene illustrato come ValueType impedisce che i tipi di riferimento passati a metodi. Definisce una classe denominata Utility che contiene quattro metodi: IsNumeric, che indica se il relativo argomento è un numero. IsInteger, che indica se il relativo argomento è un numero intero. IsFloat, che indica se il relativo argomento è un numero a virgola mobile; e Compare, che indica la relazione tra due valori numerici. In ogni caso, i parametri del metodo sono di tipo ValueType, e i tipi di riferimento vengono impediti passati ai metodi.

using System;
using System.Numerics;


public class Utility
{
   public enum NumericRelationship {
      GreaterThan = 1, 
      EqualTo = 0,
      LessThan = -1
   };

   public static NumericRelationship Compare(ValueType value1, ValueType value2)
   {
      if (! IsNumeric(value1)) 
         throw new ArgumentException("value1 is not a number.");
      else if (! IsNumeric(value2))
         throw new ArgumentException("value2 is not a number.");

      // Use BigInteger as common integral type
      if (IsInteger(value1) && IsInteger(value2)) {
         BigInteger bigint1 = (BigInteger) value1;
         BigInteger bigint2 = (BigInteger) value2;
         return (NumericRelationship) BigInteger.Compare(bigint1, bigint2);
      }
      // At least one value is floating point; use Double.
      else {
         Double dbl1 = 0;
         Double dbl2 = 0;
         try {
            dbl1 = Convert.ToDouble(value1);
         }
         catch (OverflowException) {
            Console.WriteLine("value1 is outside the range of a Double.");
         }
         try {
            dbl2 = Convert.ToDouble(value2);
         }
         catch (OverflowException) {
            Console.WriteLine("value2 is outside the range of a Double.");
         }
         return (NumericRelationship) dbl1.CompareTo(dbl2);
      }
   }

   public static bool IsInteger(ValueType value)
   {         
      return (value is SByte || value is Int16 || value is Int32 
              || value is Int64 || value is Byte || value is UInt16  
              || value is UInt32 || value is UInt64 
              || value is BigInteger); 
   }

   public static bool IsFloat(ValueType value) 
   {         
      return (value is float | value is double | value is Decimal);
   }

   public static bool IsNumeric(ValueType value)
   {
      return (value is Byte ||
              value is Int16 ||
              value is Int32 ||
              value is Int64 ||
              value is SByte ||
              value is UInt16 ||
              value is UInt32 ||
              value is UInt64 ||
              value is BigInteger ||
              value is Decimal ||
              value is Double ||
              value is Single);
   }
}

Nell'esempio seguente sono illustrate le chiamate ai metodi del Utility classe.

public class Example
{
   public static void Main()
   {
      Console.WriteLine(Utility.IsNumeric(12));
      Console.WriteLine(Utility.IsNumeric(true));
      Console.WriteLine(Utility.IsNumeric('c'));
      Console.WriteLine(Utility.IsNumeric(new DateTime(2012, 1, 1)));
      Console.WriteLine(Utility.IsInteger(12.2));
      Console.WriteLine(Utility.IsInteger(123456789));
      Console.WriteLine(Utility.IsFloat(true));
      Console.WriteLine(Utility.IsFloat(12.2));
      Console.WriteLine(Utility.IsFloat(12));
      Console.WriteLine("{0} {1} {2}", 12.1, Utility.Compare(12.1, 12), 12);
   }
}
// The example displays the following output:
//       True
//       False
//       False
//       False
//       False
//       True
//       False
//       True
//       False
//       12.1 GreaterThan 12

Universal Windows Platform
Disponibile da 8
.NET Framework
Disponibile da 1.1
Libreria di classi portabile
Supportato in: piattaforme .NET portabili
Silverlight
Disponibile da 2.0
Windows Phone Silverlight
Disponibile da 7.0
Windows Phone
Disponibile da 8.1

I membri statici pubblici ( Condiviso in Visual Basic) di questo tipo è thread safe. Non tutti i membri di istanza sono garantiti come thread safe.

Torna all'inizio
Mostra: