C# 10: 명료한 할당
먼저 명료한 할당(Definite Assignment, 혹은 한정된 할당으로 번역)이라는 용어의 의미를 살펴보자. 함수의 실행 코드의 특정 위치에서 컴파일러가 정적 코드 분석을 통해 변수값이 자동 초기화 되었거나 혹은 적어도 하나의 할당문에 의해 그 값이 할당되었는지 판단할 수 있을 때, 그 변수는 명료하게 할당(definitely assigned)되었다고 표현한다. 예를 들어, 다음과 같은 경우가 명료한 할당에 해당한다: 변수의 초기값이 할당되었을 때, 처음에 초기화 되지는 않은 변수에 대해 모든 실행 경로에서 적어도 어떤 값이 한번 할당될 때 등등.
C# 10: 향상된 명료한 할당
C# 10 이전에서는 명료한 할당과 관련하여 일부 불필요하게 컴파일러 에러를 내는 경우(False Positive)가 있었는데, C# 10에서는 이를 개선하여 불필요한 에러를 내지 않도록 하였다.
예를 들어, 아래 예제에서 C# 9.0은 변수 obj가 명확히 할당되었는 지 판단하지 못하고 CS0165: Use of unassigned local variable 'obj' 이라는 에러를 발생시킨다. 하지만, C# 10에서는 좀 더 향상된 분석을 통해 에러를 내지 않게 되었다.
예를 들어, 아래 예제에서 C# 9.0은 변수 obj가 명확히 할당되었는 지 판단하지 못하고 CS0165: Use of unassigned local variable 'obj' 이라는 에러를 발생시킨다. 하지만, C# 10에서는 좀 더 향상된 분석을 통해 에러를 내지 않게 되었다.
예제
class Program
{
static void Main(string[] args)
{
var t = new TestClass();
Run(t);
}
public static void Run(TestClass t)
{
if (t?.GetObject(out object obj) == true)
{
// C# 9 (.NET 5)에서는 obj 변수값이 할당되었는 체크 못하고 에러 발생:
// C# 10에서는 에러 없음.
string s = obj.ToString();
}
}
}
class TestClass
{
public bool GetObject(out object o)
{
o = new object();
return true;
}
}
{
static void Main(string[] args)
{
var t = new TestClass();
Run(t);
}
public static void Run(TestClass t)
{
if (t?.GetObject(out object obj) == true)
{
// C# 9 (.NET 5)에서는 obj 변수값이 할당되었는 체크 못하고 에러 발생:
// C# 10에서는 에러 없음.
string s = obj.ToString();
}
}
}
class TestClass
{
public bool GetObject(out object o)
{
o = new object();
return true;
}
}