본문 바로가기
C#

C#] Discard Variable '_' 사용법

by Fastlane 2023. 11. 14.
728x90
반응형

출처 : Using a Discard Variable in C# - Code Maze (code-maze.com)

 

 discard variable과 usuable variable의 차이를 알아보고, 실사용법도 살펴보자. 

 

C# 7은 코드에서 불필요한 값을 대체할 discards를 소개했다. write-only variable이며, compiler나 코드를 읽는 사람이 누구든 diacard variable의 content를 버려도 됨을 나타낸다. 

 

값을 받지만, 사용할 일이 없는 경우에 유용하다. 

 

Usual Variable과 Discard Variable의 차이점

discard는 '_' 문자로 표기한다. 

_ = "This is the syntax for a discard";

 

discards는 할당되지 않은 변수와 같다. 보통의 변수와 다르게, var 또는 다른 type keyword로 선언할 수 없다. 

scope내에 하나 이상의 discards를 가질 수 있다. 버릴 값 한개마다 underscore placeholder를 사용할 수 있다. discards가 값을 갖는 것 처럼 보여도, 우리가 값을 추출하려고 시도하면 compiler error를 받는다. 

 

_를 var나 다른 type으로 선언하면 보통의 변수가 되며, discard 기능을 상실한다. 

string _ = "This is no longer a discard";

 

왜 Discard Variable을 사용하는가?

우리가 discards를 무시한다면, 왜 필요한가?

 

discards는 최소한의 warnings과 함께 클린 코드를 유지하도록 도와준다. 우리가 필요없는 반환값이 있는 함수를 호출할때 discard가 반환값을 처리하도록 함으로 사용하지 않는 값에 대한 compiler warnings를 무시한다. 

몇몇 APIs와 Libraries 또한 필요없는 값을 반환한다. discards가 반환값을 관리하도록 하며, API/library signatures를 유지할 수 있다. 

 

pattern matching, deconstruction과 작업 시, discards는 상관없는 data structure를 무시하도록 허용한다. 

코드를 단순하고 명확하게 한다. 

 

C#에서 Discard Variable 사용 케이스

코드에서 discard를 사용하는 것은 compiler와 다른 code reader에게 우리의 의도를 효과적으로 알려준다. expression의 outcome을 고의로 무시하려는 의도를 명확히 한다. 

 

expression의 결과값을 하나 또는 tuple expression과 함께 하나 이상의 elements, out parameter 또는 pattern-matching expression의 target을 무시할 수 있다. 

 

다양한 경우를 살펴보자. 

 

Discards as Out Parameters

함수 호출 시, out parameter 값을 discard할 수 있다. 

예를들어, TryParse()는 bool을 return한다. parse가 성공한 경우, true를 return하고 out parameter 값을 저장한다. 

public static (bool result, string errorMessage) GetNumber(string input)
{
    bool result = int.TryParse(input, out _);

    if (!result)
    {
        return (false, "Not a valid number");
    }

    return (true, "");
}

위 예에서, int.TryParse()를 시도하고 out parameter는 discard한다. 오직, parse의 성공여부만 확인한다. 

 

Discards in Tuple Deconstruction

tuples과 작업할 때, 종종 tuple이 포함한 모든 값이 필요하지 않을 수 있다. 

public static (int, int, int) GetSum(int num1, int num2)
{
    return (num1, num2, num1 + num2);
}

GetSum() 함수는 숫자과 합을 포함하는 three-tuple을 반환한다. 

 

discard를 사용해 선택적으로 특정한 tuple elements를 무시할 수 있다. 

var (_, _, sum) = DiscardExamples.GetSum(9, 89);

 

두 수는 이미 GetSum()으로 전달되었기 때문에 returned 값으로 필요가 없다. 합계만 필요하므로 다른 수는 discards로 지정한다. 

 

Discards in Pattern Matching

다양한 data types을 포함하는 array에 switch expression과 함께 item의 type을 확인하기 위해 pattern matcing을 사용할 수 있다. 

public static void GetType(object[] objects)
{
    foreach (var item in objects)
    {
        Console.WriteLine(item switch
        {
            string => "it's a string",
            int => "it's an int",
            _ => "Neither string nor int"
        });  
    }
}

위 함수는 items이 string 또는 integer인지 확인한다. 다른 data type은 discard로 취급하고, 'Neither string nore int'라고 console에 print한다. 

 

Discards in Lambda Expressions

C# 9부터, lambda expression의 2개 이상의 input parameters를 discards할 수 있다. 

Func<char, char, char> constant = (_, _) => 'C';

C#의 이전버전과의 호환성을 유지하기 위해, single input parameter를 '_'에 할당할 때는 valid, read/write 변수로 해석된다. 

 

결론

discard '_'를 코드에 사용하여, compiler에게 결과값을 무시할 것임을 알려준다. 특히, 값을 받지만 사용할 계획이 없는 경우 유용하다. 

728x90
반응형

댓글