영어로 읽기

다음을 통해 공유


ValueType 클래스

정의

값 형식에 대한 기본 클래스를 제공합니다.

C#
public abstract class ValueType
C#
[System.Serializable]
public abstract class ValueType
C#
[System.Serializable]
[System.Runtime.InteropServices.ComVisible(true)]
public abstract class ValueType
상속
ValueType
파생
특성

설명

ValueType 값 형식에 더 적합한 구현을 사용하여 Object 가상 메서드를 재정의합니다. ValueType상속되는 Enum참조하세요.

데이터 형식은 값 형식 및 참조 형식으로 구분됩니다. 값 형식은 구조체에서 스택 할당되거나 인라인으로 할당됩니다. 참조 형식은 힙 할당됩니다. 참조 형식과 값 형식은 모두 최종 기본 클래스 Object파생됩니다. 값 형식이 개체처럼 동작해야 하는 경우 값 형식을 참조 개체처럼 보이게 하는 래퍼가 힙에 할당되고 값 형식의 값이 이 개체에 복사됩니다. 래퍼가 표시되어 시스템에서 값 형식이 포함되어 있음을 알 수 있습니다. 이 프로세스를 boxing이라고 하며 역방향 프로세스를 unboxing이라고 합니다. Boxing 및 unboxing을 사용하면 모든 형식을 개체로 처리할 수 있습니다.

ValueType 값 형식에 대한 암시적 기본 클래스이지만 ValueType 직접 상속하는 클래스를 만들 수는 없습니다. 대신 개별 컴파일러는 값 형식 생성을 지원하기 위해 언어 키워드 또는 구문(예: C#의 struct 및 visual Basic의 Structure...End Structure)을 제공합니다.

.NET Framework에서 값 형식의 기본 클래스 역할을 하는 것 외에도 ValueType 구조체는 일반적으로 코드에서 직접 사용되지 않습니다. 그러나 메서드 호출에서 매개 변수로 사용하여 가능한 인수를 모든 개체가 아닌 값 형식으로 제한하거나 메서드가 다양한 값 형식을 처리하도록 허용할 수 있습니다. 다음 예제에서는 ValueType 참조 형식이 메서드에 전달되지 않도록 방지하는 방법을 보여 줍니다. 인수가 숫자인지 여부를 나타내는 네 가지 메서드인 IsNumeric포함하는 Utility이라는 클래스를 정의합니다. IsInteger- 인수가 정수인지 여부를 나타냅니다. IsFloat- 인수가 부동 소수점 숫자인지 여부를 나타냅니다. 및 Compare- 두 숫자 값 간의 관계를 나타냅니다. 각 경우에서 메서드 매개 변수는 ValueType형식이며 참조 형식은 메서드에 전달되지 않습니다.

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

다음 예제에서는 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

생성자

ValueType()

ValueType 클래스의 새 인스턴스를 초기화합니다.

메서드

Equals(Object)

이 인스턴스와 지정된 개체가 같은지 여부를 나타냅니다.

GetHashCode()

이 인스턴스의 해시 코드를 반환합니다.

GetType()

현재 인스턴스의 Type 가져옵니다.

(다음에서 상속됨 Object)
MemberwiseClone()

현재 Object단순 복사본을 만듭니다.

(다음에서 상속됨 Object)
ToString()

이 인스턴스의 정규화된 형식 이름을 반환합니다.

적용 대상

제품 버전
.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

추가 정보