C# null 안전 기능

Tip

이 문서는 이미 하나 이상의 프로그래밍 언어를 알고 있으며 C#을 학습하는 개발자를 위한 기본 사항 섹션의 일부입니다. 프로그래밍을 처음 접하는 경우 먼저 시작 자습서로 시작 하세요.

Java 또는 C++에서 제공하시겠습니까? C#은 nullable 참조 형식을 통해 컴파일 시간 null 보안을 제공합니다. 목표는 Java @NonNull 주석과 비슷하지만 컴파일러에 의해 적용됩니다. C#에는 널 안전한 식을 간결하게 만들어 주는 전용 연산자 ?.??가 있습니다.

null 는 값이 없음을 나타냅니다. null 참조에서 멤버에 접근하려고 메서드를 호출하거나 속성을 읽을 때, 실행 중에 NullReferenceException 예외가 발생합니다.

// Accessing a member on null throws NullReferenceException at runtime:
// string? name = null;
// int length = name.Length; // throws NullReferenceException

// Check before you dereference:
string? name = null;
if (name is not null)
{
    Console.WriteLine($"Name has {name.Length} characters.");
}
else
{
    Console.WriteLine("Name has no value.");
}
// Output: Name has no value.

C#은 null로부터 안전한 코드를 작성하는 세 가지 보완 도구를 제공합니다.

  • Nullable 값 형식: 값 형식 (예: int 또는 bool)이 null를 포함할 수 있도록 허용합니다.
  • Nullable 참조 형식: 컴파일러가 참조가 null 일 가능성을 추적할 수 있게 합니다. null
  • Null 연산자: null로부터 안전한 액세스 및 대체 논리를 간결하게 표현

Nullable 값 형식

값 형식(예: int, double, 및 bool)은 기본적으로 null을(를) 보유할 수 없습니다. 형식 이름에 ?를 추가하여 값 또는 를 포함할 수 있는 null을 만드십시오.

int? score = null;
Console.WriteLine(score.HasValue);               // False

score = 95;
Console.WriteLine(score.HasValue);               // True
Console.WriteLine(score.GetValueOrDefault());    // 95

int? missing = null;
Console.WriteLine(missing.GetValueOrDefault(-1)); // -1

Nullable 값 형식은 기본 값 형식이 "데이터 없음"을 나타내야 하는 경우에 유용합니다. 일반적인 시나리오에는 없는 데이터베이스 열, 선택적 구성 설정 및 아직 캡처되지 않은 센서 판독값이 포함됩니다.

선언, 확인 및 변환에 대한 전체 범위는 Nullable 값 형식을 참조하세요.

nullable 참조 형식

배열, 클래스 인스턴스와 같은 참조 형식string은 런타임에 null을 보유할 수 있습니다. Nullable 참조 형식 은 null 의도를 명시적으로 만들고 컴파일 시 발생하는 실수를 잡아내는 기능을 제공하는 컴파일러 기능입니다.

주석을 ? 사용하여 의도를 선언합니다.

  • string?— 이 참조일 null. 먼저 확인하지 않고 역참조하면 컴파일러가 경고합니다.
  • string — 이 참조는 하지 않아야 합니다 null. null를 할당 시 컴파일러에서 경고합니다.
// string?  means this reference might be null
// string   means this reference should not be null
string? nullableName = null;
string  nonNullName  = "Alice";

// ?. safely accesses a member when the reference might be null
string display = nullableName?.ToUpper() ?? "(no name)";
Console.WriteLine(display);         // (no name)

display = nonNullName.ToUpper();    // safe: nonNullName is never null
Console.WriteLine(display);         // ALICE

최신 SDK 템플릿에서 만드는 모든 .NET 프로젝트는 기본적으로 nullable 참조 형식을 사용하도록 설정합니다. 사용 및 주석 지정에 대한 전체 지침은 Nullable 참조 형식을 참조하세요.

Null 연산자

C#에는 모든 곳에서 수동 if-null 가드 없이 null 안전 코드를 작성할 수 있는 여러 연산자가 포함되어 있습니다.

연산자 Name Purpose
?. Null 조건부 멤버 액세스 개체가 null이 아닌 경우에만 멤버에 액세스
?[] Null 조건부 인덱서 액세스 컬렉션이 null이 아닌 경우에만 요소에 액세스
?? Null 병합 연산자 식이 null인 경우 대체 값을 반환합니다.
??= null 병합 할당 변수 값이 특정 조건일 때만 할당하십시오 null
is null / is not null Null 패턴 선호하는 null 테스트
string? city = GetCity();

// ?. — access a member only when non-null
int? len = city?.Length;

// ?? — substitute a default when null
string display = city ?? "unknown";

// is null — preferred null test
if (city is null)
{
    Console.WriteLine("No city provided.");
}
else
{
    Console.WriteLine($"{display} ({len} chars)");
}
// Output: No city provided.

각 연산자의 자세한 예제는 Null 연산자를 참조하세요.

Nullable 값 형식 및 nullable 참조 형식은 다양한 용도로 사용됩니다.

Nullable 값 형식과 Nullable 참조 형식은 서로 대체 가능한 것이 아닙니다. 다음과 같은 다양한 문제를 해결합니다.

  • "값 없음"을 나타내야 하는 값 형식에 사용합니다T?. 예를 들어 선택적 데이터베이스 열 또는 int? 아직 예약되지 않은 이벤트에 사용합니다DateTime?.
  • 참조 string? 및 기타 nullable 참조 주석을 사용하여 참조가 있음은 null 문서화하여 컴파일러가 NullReferenceException 런타임에 발생하기 전에 경고할 수 있도록 합니다.

이러한 기능과 null 연산자를 함께 사용하면 null로부터 안전한 C# 코드를 작성할 수 있는 전체 도구 집합이 제공됩니다.