Przeczytaj w języku angielskim

Udostępnij za pośrednictwem


ValueType Klasa

Definicja

Udostępnia klasę bazową dla typów wartości.

C#
public abstract class ValueType
C#
[System.Serializable]
public abstract class ValueType
C#
[System.Serializable]
[System.Runtime.InteropServices.ComVisible(true)]
public abstract class ValueType
Dziedziczenie
ValueType
Pochodne
Atrybuty

Uwagi

ValueType zastępuje metody wirtualne z Object przy użyciu bardziej odpowiednich implementacji dla typów wartości. Zobacz również Enum, który dziedziczy z ValueType.

Typy danych są rozdzielane typami wartości i typami referencyjnymi. Typy wartości są przydzielane stosem lub przydzielane w tekście w strukturze. Typy referencyjne są przydzielane stertami. Zarówno typy odwołań, jak i wartości pochodzą z ostatecznej klasy bazowej Object. W przypadkach, gdy jest konieczne, aby typ wartości zachowywał się jak obiekt, otoka, która sprawia, że typ wartości wygląda jak obiekt odwołania jest przydzielany na stercie, a wartość typu wartości jest kopiowana do niego. Otoka jest oznaczona, aby system wiedział, że zawiera typ wartości. Ten proces jest znany jako boxing, a proces odwrotny jest nazywany rozpętowywaniem. Boxing and unboxing zezwalają na traktowanie dowolnego typu jako obiektu.

Chociaż ValueType jest niejawną klasą bazową dla typów wartości, nie można utworzyć klasy dziedziczonej bezpośrednio z ValueType. Zamiast tego poszczególne kompilatory udostępniają słowo kluczowe lub konstrukcję języka (na przykład struct w języku C# i Structure...End Structure w Visual Basic), aby obsługiwać tworzenie typów wartości.

Oprócz pełnienia funkcji jako klasy bazowej dla typów wartości w programie .NET Framework struktura ValueType zwykle nie jest używana bezpośrednio w kodzie. Można go jednak użyć jako parametru w wywołaniach metody, aby ograniczyć możliwe argumenty do typów wartości zamiast wszystkich obiektów lub zezwolić metodzie na obsługę wielu różnych typów wartości. W poniższym przykładzie pokazano, jak ValueType uniemożliwia przekazywanie typów odwołań do metod. Definiuje klasę o nazwie Utility zawierającą cztery metody: IsNumeric, która wskazuje, czy jego argument jest liczbą; IsInteger, który wskazuje, czy jego argument jest liczbą całkowitą; IsFloat, który wskazuje, czy jego argument jest liczbą zmiennoprzecinkową; i Compare, który wskazuje relację między dwiema wartościami liczbowymi. W każdym przypadku parametry metody są typu ValueType, a typy referencyjne nie mogą być przekazywane do metod.

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

Poniższy przykład ilustruje wywołania metod klasy Utility.

C#
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

Konstruktory

ValueType()

Inicjuje nowe wystąpienie klasy ValueType.

Metody

Equals(Object)

Wskazuje, czy to wystąpienie i określony obiekt są równe.

GetHashCode()

Zwraca kod skrótu dla tego wystąpienia.

GetType()

Pobiera Type bieżącego wystąpienia.

(Odziedziczone po Object)
MemberwiseClone()

Tworzy płytkią kopię bieżącego Object.

(Odziedziczone po Object)
ToString()

Zwraca w pełni kwalifikowaną nazwę typu tego wystąpienia.

Dotyczy

Zobacz też