Ler em inglês

Compartilhar via


ValueType Classe

Definição

Fornece a classe base para tipos de valor.

C#
public abstract class ValueType
C#
[System.Serializable]
public abstract class ValueType
C#
[System.Serializable]
[System.Runtime.InteropServices.ComVisible(true)]
public abstract class ValueType
Herança
ValueType
Derivado
Atributos

Comentários

ValueType substitui os métodos virtuais de Object com implementações mais apropriadas para tipos de valor. Veja também Enum, que herda de ValueType.

Os tipos de dados são separados em tipos de valor e tipos de referência. Os tipos de valor são alocados em pilha ou alocados embutidos em uma estrutura. Os tipos de referência são alocados em heap. Os tipos de referência e de valor são derivados da classe base final Object. Nos casos em que é necessário que um tipo de valor se comporte como um objeto, um wrapper que faz com que o tipo de valor pareça um objeto de referência é alocado no heap e o valor do tipo de valor é copiado nele. O wrapper é marcado para que o sistema saiba que ele contém um tipo de valor. Esse processo é conhecido como boxing e o processo inverso é conhecido como unboxing. O boxing e o unboxing permitem que qualquer tipo seja tratado como um objeto.

Embora ValueType seja a classe base implícita para tipos de valor, você não pode criar uma classe que herda de ValueType diretamente. Em vez disso, compiladores individuais fornecem uma palavra-chave de linguagem ou constructo (como struct em C# e Structure...End Structure no Visual Basic) para dar suporte à criação de tipos de valor.

Além de servir como a classe base para tipos de valor no .NET Framework, a estrutura ValueType geralmente não é usada diretamente no código. No entanto, ele pode ser usado como um parâmetro em chamadas de método para restringir possíveis argumentos a tipos de valor em vez de todos os objetos ou para permitir que um método manipule vários tipos de valor diferentes. O exemplo a seguir ilustra como ValueType impede que tipos de referência sejam passados para métodos. Ele define uma classe chamada Utility que contém quatro métodos: IsNumeric, que indica se seu argumento é um número; IsInteger, que indica se seu argumento é um inteiro; IsFloat, que indica se seu argumento é um número de ponto flutuante; e Compare, que indica a relação entre dois valores numéricos. Em cada caso, os parâmetros do método são do tipo ValueTypee os tipos de referência são impedidos de serem passados para os métodos.

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

O exemplo a seguir ilustra chamadas para os métodos da classe 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

Construtores

ValueType()

Inicializa uma nova instância da classe ValueType.

Métodos

Equals(Object)

Indica se essa instância e um objeto especificado são iguais.

GetHashCode()

Retorna o código hash dessa instância.

GetType()

Obtém o Type da instância atual.

(Herdado de Object)
MemberwiseClone()

Cria uma cópia superficial do Objectatual.

(Herdado de Object)
ToString()

Retorna o nome de tipo totalmente qualificado dessa instância.

Aplica-se a

Produto Versões
.NET Core 1.0, Core 1.1, Core 2.0, Core 2.1, Core 2.2, Core 3.0, Core 3.1, 5, 6, 7, 8, 9
.NET Framework 1.1, 2.0, 3.0, 3.5, 4.0, 4.5, 4.5.1, 4.5.2, 4.6, 4.6.1, 4.6.2, 4.7, 4.7.1, 4.7.2, 4.8, 4.8.1
.NET Standard 1.0, 1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 2.0, 2.1
UWP 10.0

Confira também