✍ nameof가 없는 샘플 코드
static void Main(string[] args)
{
PrintInfo("Jane",30);
}
static void PrintInfo(string name, int age)
{
Console.WriteLine($"name : {name}, age : {age}");
}
위의 코드에서 PrintInfo의 첫번째 인자인 name을 fullName으로 이름을 바꾸려고 하면, 식 안의 name도 컴파일 에러가 뜨면서 fullName으로 바꿀 것을 강제한다.
✍ nameof가 없을 때 발생하는 문제
static void PrintInfo(string fullName, int age)
{
Console.WriteLine($"name : {fullName}, age : {age}"); //컴파일 에러
}
그러나 출력 결과에 쓰일 리터럴은 여전히 name으로 남아있다는 문제가 있다. nameof를 쓰면 이 문제는 간단하게 해결된다.
✍ nameof 로 해결
static void PrintInfo(string name, int age)
{
Console.WriteLine($"{nameof(name)} : {name}, {nameof(age)} : {age}");
}
nameof를 쓴 상태에서 첫번째 인자의 인자를 바꾸려고 하면, 리터럴로 쓰일 name도 변경하라고 강제한다.
static void PrintInfo(string fullName, int age)
{
Console.WriteLine($"{nameof(fullName)} : {fullName}, {nameof(age)} : {age}");
}
그 결과 위와 같이 리터럴도 올바르게 변경할 수 있다.
✍ nameof의 다양한 인자 샘플 코드
class Test
{
static void Main(string[] args)
{
Console.WriteLine(nameof(Person));
Console.WriteLine(nameof(PrintInfo));
Person p = new Person() { Name = "Peter", Age = 33};
PrintInfo(p.Name, p.Age);
}
class Person
{
public string Name { get; set; }
public int Age { get; set; }
}
static void PrintInfo(string paramName, int paramAge)
{
Console.WriteLine($"{nameof(paramName)} : {paramName}, {nameof(paramAge)} : {paramAge}");
}
}
🧐 reflection vs nameof
: 리플렉션은 코드가 실행돼야 이름이 구해지지만,
nameof는 컴파일러가 컴파일 시점에 문자열로 직접 치환하기 때문에 실행 시점에 부하가 없다.