어떻게 현대화 C\#문법 간소화 코드 를 이용 합 니까?
최근 몇 가지 버 전의 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 TupleC\#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);
DeconstructNamed 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");
RecordRecord 는 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 StatementTop-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\#간략화 코드 내용 은 우리 의 이전 글 을 검색 하거나 아래 의 관련 글 을 계속 조회 하 시기 바 랍 니 다.앞으로 많은 응원 바 랍 니 다!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
C#Task를 사용하여 비동기식 작업을 수행하는 방법라인이 완성된 후에 이 라인을 다시 시작할 수 없습니다.반대로 조인(Join)만 결합할 수 있습니다 (프로세스가 현재 라인을 막습니다). 임무는 조합할 수 있는 것이다. 연장을 사용하여 그것들을 한데 연결시키는 것이...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.