이 항목에서는 F#에서 null 값을 사용하는 방법을 설명합니다.
F# 9 이전의 Null 값
Null 값은 일반적으로 F#에서 값 또는 변수에 사용되지 않습니다. 그러나 null은 특정 상황에서 비정상적인 값으로 나타납니다. 형식이 F#에 정의된 경우 AllowNullLiteral 특성이 형식에 적용되지 않는 한 null은 일반 값으로 허용되지 않습니다. 형식이 다른 .NET 언어로 정의된 경우 null은 가능한 값이며 이러한 형식과 상호 운용하는 경우 F# 코드에 null 값이 발생할 수 있습니다.
F#에서 정의되고 F#에서 엄격하게 사용되는 형식의 경우 F# 라이브러리를 사용하여 null 값을 직접 만드는 유일한 방법은 Unchecked.defaultof 또는 Array.zeroCreate사용하는 것입니다. 그러나 다른 .NET 언어에서 사용되는 F# 형식의 경우 또는 .NET Framework와 같이 F#으로 작성되지 않은 API와 함께 해당 형식을 사용하는 경우 null 값이 발생할 수 있습니다.
다른 .NET 언어에서 가능한 null 값이 있는 참조 변수를 사용할 수 있는 경우 F#에서 option
형식을 사용할 수 있습니다. F# option
형식의 null 대신 개체가 없는 경우 옵션 값 None
사용합니다. 객체가 있을 때 객체 obj
에 옵션 값 Some(obj)
을 사용합니다. 자세한 내용은 옵션참조하세요. 주의하세요, Some x
에서 x
가 null
인 경우, 여전히 null
값을 Option에 포함시킬 수 있습니다. 이 때문에 값이 null
때 None
사용하는 것이 중요합니다.
null
키워드는 F#의 유효한 키워드이며. .NET Framework API 또는 다른 .NET 언어로 작성된 다른 API로 작업할 때 사용해야 합니다. null 값이 필요할 수 있는 두 가지 상황은 .NET API를 호출하고 null 값을 인수로 전달하는 경우와 .NET 메서드 호출에서 반환 값 또는 출력 매개 변수를 해석할 때입니다.
null 값을 .NET 메서드에 전달하려면 호출 코드에서 null
키워드만 사용합니다. 다음 코드 예제에서는 이를 보여 줍니다.
open System
// Pass a null value to a .NET method.
let ParseDateTime (str: string) =
let (success, res) =
DateTime.TryParse(str, null, System.Globalization.DateTimeStyles.AssumeUniversal)
if success then Some(res) else None
.NET 메서드에서 가져온 null 값을 해석하려면 가능한 경우 패턴 일치를 사용합니다. 다음 코드 예제에서는 패턴 일치를 사용하여 입력 스트림의 끝을 지나 읽으려고 할 때 ReadLine
반환되는 null 값을 해석하는 방법을 보여 줍니다.
// Open a file and create a stream reader.
let fileStream1 =
try
System.IO.File.OpenRead("TextFile1.txt")
with :? System.IO.FileNotFoundException ->
printfn "Error: TextFile1.txt not found."
exit (1)
let streamReader = new System.IO.StreamReader(fileStream1)
// ProcessNextLine returns false when there is no more input;
// it returns true when there is more input.
let ProcessNextLine nextLine =
match nextLine with
| null -> false
| inputString ->
match ParseDateTime inputString with
| Some(date) -> printfn "%s" (date.ToLocalTime().ToString())
| None -> printfn "Failed to parse the input."
true
// A null value returned from .NET method ReadLine when there is
// no more input.
while ProcessNextLine(streamReader.ReadLine()) do
()
F# 형식의 널 값은 Unchecked.defaultof
을 호출하는 Array.zeroCreate
을 사용할 때와 같은 다른 방법으로도 생성될 수 있습니다. null 값을 캡슐화 상태로 유지하려면 이러한 코드에 주의해야 합니다. F#용 라이브러리에서는 모든 함수에서 null 값을 확인할 필요가 없습니다. 다른 .NET 언어와의 상호 운용을 위해 라이브러리를 작성하는 경우 C# 또는 Visual Basic 코드와 마찬가지로 null 입력 매개 변수에 대한 검사를 추가하고 ArgumentNullException
throw해야 할 수 있습니다.
다음 코드를 사용하여 임의의 값이 null인지 확인할 수 있습니다.
match box value with
| null -> printf "The value is null."
| _ -> printf "The value is not null."
F# 9로 시작하는 null 값들
F# 9에서는 null
값으로 사용할 수 있는 참조 형식을 처리하기 위해 언어에 추가 기능이 추가됩니다. 이러한 속성은 기본적으로 꺼져 있습니다. 설정하려면 프로젝트 파일에 다음 속성을 넣어야 합니다.
<Nullable>enable</Nullable>
그러면 --checknulls+
플래그 F# 컴파일러에 전달하고 빌드에 대한 NULLABLE
전처리기 지시문 설정합니다.
Null 허용 여부로 명시적으로 옵트인하려면 형식 선언에 새 구문 접미사가 추가되어야 합니다.
type | null
막대 기호 |
구문에서 논리적 OR의 의미를 가지며, 기본 형식과 nullable 참조라는 두 개의 비연속 형식 집합의 합합을 작성합니다. F# 구분된 합집합의 여러 사례를 선언하는 데 사용되는 것과 동일한 구문 기호입니다. type AB = A | B
는 A
또는 B
의 의미를 가집니다.
모든 참조 유형이 일반적으로 사용되는 위치에 nullable 주석 | null
를 사용할 수 있습니다.
- 유니온 타입, 레코드 타입, 사용자 정의 타입의 필드.
- 기존 형식에 대한 형식 별칭입니다.
- 제네릭 형식의 애플리케이션을 입력합니다.
- 바인딩, 매개 변수 또는 반환 형식을 허용하기 위한 명시적 형식 주석입니다.
- 멤버, 속성 또는 필드와 같은 개체 프로그래밍 구문에 주석을 입력합니다.
type AB = A | B
type AbNull = AB | null
type RecordField = { X: string | null }
type TupleField = string * string | null
type NestedGenerics = { Z : List<List<string | null> | null> | null }
기호 |
는 F#에서 다른 용도로 사용될 수 있으며, 이는 구문적 모호성을 초래할 수 있습니다. 이러한 경우, null 주석이 추가된 형식 주위에 괄호가 필요합니다.
// Unexpected symbol '|' (directly before 'null') in member definition
type DUField = N of string | null
동일한 형식을 한 쌍의 ( )
괄호로 래핑하면 문제가 해결됩니다.
type DUField = N of (string | null)
패턴 일치에 사용되는 경우 |
서로 다른 패턴 일치 절을 구분하는 데 사용됩니다.
match x with
| ?: string | null -> ...
이 코드 조각은 실제로 코드가 먼저 string
형식에 대해 형식 테스트를 수행한 다음 null 처리를 위한 별도의 절을 갖는 코드와 동일합니다.
match x with
| ?: string
| null -> ...
중요하다
상호 운용성을 위해 추가 null 관련 기능이 언어에 추가되었습니다. F# 형식 모델링에서 | null
사용하는 것은 누락된 정보를 나타내는 idiomatic으로 간주되지 않습니다. 이러한 용도로는 위에서 설명한 대로 옵션을 사용합니다. 스타일 가이드에서 null 관련 규범에 대해 자세히 알아보세요.
참조
- 값
- 일치 식
.NET