그들 중 누구도 직접 다루지 않는 중요하고 미묘한 문제가 있습니다. C #에서 유형을 고려하는 방법에는 정적 유형 과 런타임 유형 의 두 가지가 있습니다 .
정적 유형 은 소스 코드의 변수 유형입니다. 따라서 이것은 컴파일 타임 개념입니다. 개발 환경에서 변수 또는 속성 위로 마우스를 가져 가면 도구 설명에 표시되는 유형입니다.
헬퍼 제네릭 메서드를 작성하여 정적 유형을 얻을 수 있습니다.
Type GetStaticType<T>(T x) { return typeof(T); }
런타임 유형 은 메모리에있는 개체의 유형입니다. 따라서 이것은 런타임 개념입니다. GetType()메서드가 반환하는 유형 입니다.
개체의 런타임 형식은 개체를 보유하거나 반환하는 변수, 속성 또는 메서드의 정적 형식과 자주 다릅니다. 예를 들어 다음과 같은 코드를 가질 수 있습니다.
object o = "Some string";
변수의 정적 유형은 object이지만 런타임시 변수의 참조 유형은 입니다 string. 따라서 다음 줄은 "System.String"을 콘솔에 인쇄합니다.
Console.WriteLine(o.GetType()); // prints System.String
그러나 o개발 환경에서 변수 위로 마우스를 가져 가면 유형 System.Object(또는 이에 상응하는 object키워드)이 표시됩니다. 위의 도우미 기능을 사용하여 동일한 내용을 볼 수도 있습니다.
Console.WriteLine(GetStaticType(o)); // prints System.Object
같은 값 형 변수의 경우 int, double, System.Guid, 당신은 값 유형이 다른 유형에 대한 기본 클래스 역할을 할 수 없기 때문에 실행시의 형태는 항상 정적 형식과 동일 할 것이라는 점을 알고있다; 값 유형은 상속 체인에서 가장 많이 파생 된 유형이됩니다. 봉인 된 참조 형식의 경우에도 마찬가지입니다. 정적 형식이 봉인 된 참조 형식 인 경우 런타임 값은 해당 형식의 인스턴스이거나 null.
반대로, 변수의 정적 유형이 추상 유형 인 경우 정적 유형과 런타임 유형이 다를 것입니다.
이를 코드로 설명하려면 :
// int is a value type
int i = 0;
// Prints True for any value of i
Console.WriteLine(i.GetType() == typeof(int));
// string is a sealed reference type
string s = "Foo";
// Prints True for any value of s
Console.WriteLine(s == null || s.GetType() == typeof(string));
// object is an unsealed reference type
object o = new FileInfo("C:\\f.txt");
// Prints False, but could be true for some values of o
Console.WriteLine(o == null || o.GetType() == typeof(object));
// FileSystemInfo is an abstract type
FileSystemInfo fsi = new DirectoryInfo("C:\\");
// Prints False for all non-null values of fsi
Console.WriteLine(fsi == null || fsi.GetType() == typeof(FileSystemInfo));
int