기본 패턴
csharp
// nameof — 리팩토링 안전한 이름 문자열
void Save(string name)
{
ArgumentNullException.ThrowIfNull(name, nameof(name));
}
// typeof — 컴파일 시점 타입 객체
Type t = typeof(DateTime);
Console.WriteLine(t.FullName); // System.DateTime
// GetType — 런타임 실제 타입
object obj = "hello";
Console.WriteLine(obj.GetType()); // System.String
Console.WriteLine(obj.GetType() == typeof(string)); // true
// sizeof — 기본 값 타입 크기 (바이트)
int size = sizeof(int); // 4
int size2 = sizeof(long); // 8설명
nameof() — 리팩토링 안전한 이름 문자열
nameof(식별자) 는 변수, 파라미터, 멤버, 타입의 이름을 컴파일 시점에 문자열로 반환합니다. 하드코딩된 문자열과 달리, 이름을 바꾸면 컴파일러가 자동으로 추적합니다.
csharp
// 예외 메시지
void Process(Order order)
{
ArgumentNullException.ThrowIfNull(order, nameof(order));
// → "order" 문자열, 파라미터 이름 변경 시 자동 반영
}
// INotifyPropertyChanged 구현
private string _name = "";
public string Name
{
get => _name;
set
{
_name = value;
OnPropertyChanged(nameof(Name)); // "Name"
}
}
// 로그, 예외 메시지
throw new InvalidOperationException(
$"{nameof(ProcessPayment)} 실패: 잔액 부족");typeof() vs GetType()
typeof(T) 는 컴파일 시점에 알려진 타입의 Type 객체를 반환합니다. GetType() 은 런타임에 인스턴스의 실제 타입을 반환합니다. 상속 관계에서 두 값이 달라질 수 있습니다.
csharp
Animal a = new Dog();
typeof(Animal) == a.GetType() // false — GetType()은 Dog를 반환
typeof(Dog) == a.GetType() // true
// typeof는 제네릭 정의에도 사용 가능
Type listDef = typeof(List<>);
Console.WriteLine(listDef.IsGenericTypeDefinition); // true
Type listInt = typeof(List<int>);
Console.WriteLine(listInt.GenericTypeArguments[0]); // System.Int32타입 비교가 목적이라면 typeof / is 패턴이 더 명확합니다.
csharp
// ✅ 권장
if (obj is Dog dog) { }
// 정확한 타입 비교가 필요할 때
if (obj.GetType() == typeof(Dog)) { } // 파생 타입 제외
if (obj is Animal) { } // 파생 타입 포함sizeof() — 값 타입 크기
sizeof(T) 는 값 타입의 바이트 크기를 컴파일 시점에 반환합니다. 기본 타입은 unsafe 없이 사용 가능합니다.
csharp
sizeof(bool) // 1
sizeof(byte) // 1
sizeof(char) // 2 (UTF-16)
sizeof(int) // 4
sizeof(long) // 8
sizeof(double) // 8
sizeof(decimal)// 16커스텀 struct의 크기가 필요하면 unsafe 없이도 Unsafe.SizeOf<T>() 를 사용할 수 있습니다.
csharp
// unsafe 없이 struct 크기 확인
int size = System.Runtime.CompilerServices.Unsafe.SizeOf<MyStruct>();빠른 정리
| 연산자 | 평가 시점 | 반환값 | 주요 용도 |
|---|---|---|---|
nameof(x) | 컴파일 | string | 리팩토링 안전 이름, 예외 메시지 |
typeof(T) | 컴파일 | Type | 리플렉션, 제네릭 타입 정보 |
GetType() | 런타임 | Type | 인스턴스 실제 타입 확인 |
sizeof(T) | 컴파일 | int | 기본 값 타입 바이트 크기 |
Unsafe.SizeOf<T>() | 컴파일 | int | 커스텀 struct 크기 (unsafe 불필요) |
주의할 점
typeof(T)와 GetType()은 다형성 환경에서 다른 결과를 냅니다. 파생 타입까지 포함해 검사하려면 is 패턴 매칭을, 정확히 그 타입만 확인하려면 GetType() == typeof(T)를 사용하세요.
nameof는 멤버 접근 경로의 마지막 이름만 반환합니다. nameof(user.Name)은 "Name"을 반환하며 "user.Name"이 아닙니다. 전체 경로가 필요하면 직접 조합하세요.
참고 링크
2 sources