어떻게 현대화 C\#문법 간소화 코드 를 이용 합 니까?

Intro
최근 몇 가지 버 전의 C\#문법 에 많은 변화 가 있 습 니 다.많은 문법 들 이 코드 의 복잡 도 를 크게 간소화 하고 코드 를 더욱 간결 하 게 할 수 있 습 니 다.제 가 생각 하 는 몇 가지 실 용적 인 코드 를 더욱 간결 하 게 할 수 있 는 문법 을 공유 할 수 있 습 니 다.
Default literal expressions
C\#7.1 이후 기본 값 대신 default 을 사용 할 수 있 습 니 다.예 를 들 어:

public void Test(string str = deault){}

string str = default;

이전 버 전에 서 는 default(string)와 같은 명시 적 지정 형식 이 필요 합 니 다.형식 을 쓸 필요 가 없습니다.컴 파일 러 는 유형 을 추정 할 것 입 니 다.
Target-Typed New Expression
C\#9 에 서 는 Target-Typed New Expression 문법 을 도 입 했 습 니 다.위의 default 과 유사 합 니 다.우 리 는 대상 을 만 들 때 컴 파일 러 가 유형 을 추측 할 수 있 는 곳 에서 유형 을 다시 쓸 필요 가 없습니다.이것 은 가끔 유용 할 때 가 있 습 니 다.특히 매우 복잡 한 유형 을 쓸 때 우 리 는 한 번 만 설명 하면 됩 니 다.아래 의 예 시 를 참고 할 수 있다.

// target-typed new expression
//private static readonly Dictionary<string, Dictionary<string, string>>
//    Dictionary = new Dictionary<string, Dictionary<string, string>>();
private static readonly Dictionary<string, Dictionary<string, string>>
    Dictionary = new();

// array
ReviewRequest[] requests =
{
    new()
    {
        State = ReviewState.Rejected
    },
    new(),
    new(),
};

Named Tuple
C\#7 부터 우 리 는 Named Tuple 을 사용 하여 Tuple 의 사용 을 최적화 할 수 있 습 니 다.이전 버 전에 서 는 Item 1,Item 2 만 이렇게 Tuple 의 Value 를 사용 할 수 있 었 지만 이해 하기 어렵 습 니 다.특히 문서 설명 이 없 는 상황 에서 매번 값 을 되 돌려 주 는 곳 에 가서 모든 요소 가 무엇 을 대표 하 는 지 확인 해 야 할 수도 있 습 니 다.Named Tuple 이 나타 나 면 강 한 타 입의 Tuple 에 해당 합 니 다.코드 를 잘 이해 할 수 있 습 니 다.tuple 요소 의 의 미 를 한눈 에 알 수 있 습 니 다.밤 을 들 어 보 세 요.

(string Alpha, string Beta) namedLetters = ("a", "b");
Console.WriteLine($"{namedLetters.Alpha}, {namedLetters.Beta}");

(int code, string msg) result = (1, "");

private static (int code, string msg) NamedTuple()
{
    return (0, string.Empty);
}

var result = NamedTuple();
Console.WriteLine(result.code);

Deconstruct
Named Tuple 과 동시에 나타 날 수 있 습 니 다.클래스 에서 Deconstruct 와 Constructor 가 대응 하 는 것 을 설명 할 수 있 습 니 다.다만 Constructor 는 입력 매개 변수 이 고 Deconstruct 는 출력 매개 변수 입 니 다.예 를 들 어 보 겠 습 니 다.

public class Point
{
    public Point(double x, double y)
        => (X, Y) = (x, y);

    public double X { get; }
    public double Y { get; }

    public void Deconstruct(out double x, out double y) =>
        (x, y) = (X, Y);
}

var p = new Point(3.14, 2.71);
(double X, double Y) = p;

위의 예 는 공식 문서 의 예 입 니 다.우리 가 실제로 사용 하고 있 는 예 를 보 세 요.

public class IdNameModel
{
    public int Id { get; set; }
    public string Name { get; set; }

    public void Deconstruct(out int id, out string name)
    {
        id = Id;
        name = Name;
    }
}

여러 개의 반환 값 이 있 을 때,어떤 데 이 터 는 관심 이 없 으 면""을 사용 할 수 있 습 니 다.반환 값 을 버 리 는 것 을 표시 합 니 다.예 는 다음 과 같 습 니 다.

using System;
using System.Collections.Generic;

public class Example
{
    public static void Main()
    {
        var (_, _, _, pop1, _, pop2) = QueryCityDataForYears("New York City", 1960, 2010);

        Console.WriteLine($"Population change, 1960 to 2010: {pop2 - pop1:N0}");
    }

    private static (string, double, int, int, int, int) QueryCityDataForYears(string name, int year1, int year2)
    {
        int population1 = 0, population2 = 0;
        double area = 0;

        if (name == "New York City")
        {
            area = 468.48;
            if (year1 == 1960)
            {
                population1 = 7781984;
            }
            if (year2 == 2010)
            {
                population2 = 8175133;
            }
            return (name, area, year1, population1, year2, population2);
        }

        return ("", 0, 0, 0, 0, 0);
    }
}
// The example displays the following output:
//      Population change, 1960 to 2010: 393,149

Pattern-Matching
패턴 매 칭 은 최초 로 C\#7.1 에서 시작 되 었 습 니 다.최초의 형식 은 if(a is string str)입 니 다.이것 은 가장 간단 하고 전형 적 인 모델 매 칭 입 니 다.이것 은 이전에 두 마디 말 이 있어 야 완 성 될 수 있 는 기능 과 결합 되 어 다음 과 같이 번역 할 수 있 습 니 다.

var str = a as string;
if(str != null) //...
if 를 제외 하고 switch 에서 도 패턴 이 일치 하 는 것 을 사용 할 수 있 습 니 다.

void SwitchPattern(object obj0)
{
    switch (obj0)
    {
        case string str1:
            Console.WriteLine(str1);
            break;

        case int num1:
            Console.WriteLine(num1);
            break;
    }
}

C\#9 에 논리 연산 자 and/or/not 를 도입 하여 패턴 매 칭 을 더욱 강하 게 만 들 었 습 니 다.합 법 적 인 Base 64 문자 인지 판단 하 는 방법의 변 화 를 보 겠 습 니 다.
C\#9 이전 코드:

private static bool IsInvalid(char value)
{
    var intValue = (int)value;
    if (intValue >= 48 && intValue <= 57)
        return false;
    if (intValue >= 65 && intValue <= 90)
        return false;
    if (intValue >= 97 && intValue <= 122)
        return false;
    return intValue != 43 && intValue != 47;
}
C\#9 강화 모드 를 사용 하여 다음 코드 와 일치 합 니 다:

private static bool IsInvalid(char value)
{
    var intValue = (int)value;
    return intValue switch
    {
            >= 48 and <= 57 => false,
            >= 65 and <= 90 => false,
            >= 97 and <= 122 => false,
            _ => intValue != 43 && intValue != 47
    };
}
갑자기 또렷 해 지 는 거 아니 야~
Switch Expression
Switch Expression 은 C\#8 이 도입 한 새로운 특성 입 니 다.C\#9 는 결합 모델 매 칭 을 통 해 더욱 강화 되 었 고 그 기능 을 더욱 강하 게 만 들 었 습 니 다.예 를 들 어 보 겠 습 니 다.
수정 전 코드 는 다음 과 같 습 니 다:

var state = ReviewState.Rejected;
var stateString = string.Empty;
switch (state)
{
    case ReviewState.Rejected:
        stateString = "0";
        break;

    case ReviewState.Reviewed:
        stateString = "1";
        break;

    case ReviewState.UnReviewed:
        stateString = "-1";
        break;
}

switch expression 을 사용 한 후 코드 는 다음 과 같 습 니 다.

var state = ReviewState.Rejected;
var stateString = state switch
{
        ReviewState.Rejected => "0",
        ReviewState.Reviewed => "1",
        ReviewState.UnReviewed => "-1",
        _ => string.Empty
};
많이 간결 해 보이 고 최적화 도 더 해 보이 지 않 습 니까?다음 예 를 보 겠 습 니 다.

(int code, string msg) result = (0, "");
var res = result switch
{
        (0, _) => "success",
        (-1, _) => "xx",
        (-2, "") => "yy",
        (_, _) => "error"
};
Console.WriteLine(res);
서로 다른 상황 의 수출 결과 가 어떤 것 인지 맞 춰 보고,다시 스스로 결 과 를 달 려 보 세 요.
Index Range
Index/Range 는 C\#8 이 도입 한 새로운 특성 으로 주로 원 그룹 에 대한 조작 을 최적화 시 켜 색인 과 절편 작업 을 더욱 편리 하 게 할 수 있다.
전에 상세 한 소개 글 이 있 었 는데 참고 할 수 있 습 니 다.C\#Index 와 Range 를 사용 하여 집합 작업 을 간소화 합 니 다.
우 리 는^(hat)연산 자 를 통 해 색인 배열 의 대상 을 되 돌 릴 수 있 습 니 다..을 통 해 집합 하 는 하위 집합 을 만 들 수 있 습 니 다.간단 한 예 를 볼 수 있 습 니 다.

var arr = Enumerable.Range(1, 10).ToArray();
Console.WriteLine($"last element:{arr[^1]}");

var subArray = Enumerable.Range(1, 3).ToArray();
Console.WriteLine(arr[..3].SequenceEqual(subArray) ? "StartWith" : "No");

Record
Record 는 C\#9 가 도입 한 새로운 특성 입 니 다.record 는 특수 한 유형 입 니 다.컴 파일 러 는 우리 가 많은 일 을 하 는 데 도움 을 줄 것 입 니 다.값 에 기반 한 비 교 를 자동 으로 실현 할 수 있 고 대상 의 복사 기능 을 편리 하 게 실현 할 수 있 습 니 다.상세 하 게 소개 하면 이전의 record 소개 글 을 참고 할 수 있 습 니 다C\#9 새로운 특성--record 해독다음 과 같은 간단 한 예 를 볼 수 있 습 니 다.

public abstract record Person(string FirstName, string LastName);
public record Teacher(string FirstName, string LastName, int Grade)
    : Person(FirstName, LastName);
public record Student(string FirstName, string LastName, int Grade)
    : Person(FirstName, LastName);
public static void Main()
{
    Person teacher = new Teacher("Nancy", "Davolio", 3);
    Person student = new Student("Nancy", "Davolio", 3);
    Console.WriteLine(teacher == student); // output: False

    Student student2 = new Student("Nancy", "Davolio", 3);
    Console.WriteLine(student2 == student); // output: True
}

Top-Level Statement
Top-Level statement 은 C\#9 가 지원 하 는 새로운 기능 입 니 다.우 리 는 Main 방법 을 쓰 지 않 고 방법 체 를 직접 쓸 수 있 습 니 다.비교적 간단 한 작은 도구,작은 테스트 응용 에 있어 서 비교적 편리 할 것 입 니 다.

using static System.Console;
WriteLine("Hello world");
More
위 에 있 는 새로운 특성 외 에 도 어떤 실 용적 인 새로운 특성 이 있다 고 생각 하 세 요?댓 글로 함께 토론 해 주세요~
References
https://docs.microsoft.com/en-us/dotnet/csharp/whats-new/csharp-9
https://docs.microsoft.com/en-us/dotnet/csharp/whats-new/csharp-8
https://docs.microsoft.com/en-us/dotnet/csharp/whats-new/csharp-7
https://github.com/WeihanLi/SamplesInPractice/blob/master/CSharp9Sample/CleanCodeSample.cs
총결산
현대 화 된 C\#문법 간략화 코드 를 어떻게 활용 하 는 지 에 관 한 이 글 은 여기까지 소개 되 었 습 니 다.더 많은 관련 C\#간략화 코드 내용 은 우리 의 이전 글 을 검색 하거나 아래 의 관련 글 을 계속 조회 하 시기 바 랍 니 다.앞으로 많은 응원 바 랍 니 다!

좋은 웹페이지 즐겨찾기