C# 9 기능 목록

23897 단어 dotnetcsharp

최상위 문



C#의 매우 간단한 프로그램은 다음과 같습니다.

using System;
namespace HelloWorld
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("Hello World!");
        }
    }
}


하지만 C# 9를 사용하면 더 간단하게 만들 수 있습니다.

System.Console.WriteLine("Hello World!");


대상 유형 개체 생성



클래스가 있다고 가정해 보겠습니다.

public class Book
{
    public string Title { get; set; }
    public string Author { get; set; }

    public Book()
    {

    }

    public Book(string title, string author)
    {
        Title = title;
        Author = author;
    }
}


일반적으로 다음과 같은 객체를 생성합니다.

var book = new Book();
// or
Book book = new Book();


C#으로 우리는 다음을 할 수 있습니다:

Book book2 = new();
Book book3 = new("1", "A1");


초기화 전용 세터



클래스가 있다고 가정합니다Book.

public class Book
{
        public string Title { get; set; }
        public string Author { get; set; }
}


초기화하는 동안 값을 설정할 수 있습니다. 동시에 모든 필드에 대한 setter가 있는 한 값을 변경할 수 있습니다.

var book = new Book { Author = "1", Title = "2" };
book.Title = "2";


초기화하는 동안에만 값을 설정하고 초기화 후에는 값을 제한하려는 상황을 상상해 보십시오. C# 9 Init-only 기능이 작동합니다.

public class Book
{
        public string Title { get; init; }
        public string Author { get; init; }
}

var book = new Book { Author = "1", Title = "2" };
book.Title = "2"; // compile error


관계형 및 논리적 패턴



관계형 패턴을 통해 프로그래머는 입력 값이 상수 값과 비교할 때 관계형 제약 조건을 충족해야 함을 표현할 수 있습니다.

public class Book{  public string Title { get; set; }   public string Author { get; set; }  public static decimal Postage(decimal price) => price switch    {       < 20 => 6.99m,      >= 20 and < 40 => 5.99m,        >= 40 and < 60 => 2.99m,        _ => 0  };}


기록



수업이 있습니다:

public class Book{    public string Title { get; }    public string Author { get; } public Book(string title, string author)    {          Title = title;          Author = author;    }}


그리고 우리가 책을 만들 수 있기를 원한다고 상상해 봅시다. 다음과 같이 할 수 있습니다.

var book = new Book("Title1", "Author1");


또한 우리는 객체를 직렬화하고 역직렬화하기를 원합니다.

var json = JsonSerializer.Serialize(book);Console.WriteLine(json);var book2 = JsonSerializer.Deserialize<Book>(json);var isEqual = book == book2;Console.WriteLine($"book == book2: {isEqual}"); // false


콘솔에서 직렬화 해제된 책이 직렬화된 책과 같지 않음을 알 수 있습니다. 어떻게 동일하게 만들 수 있습니까? equals 연산자를 재정의할 수 있습니다.

public static bool operator ==(Book left, Book right) =>    left is object ? left.Equals(right) : right is null;

== 연산자를 재정의하면 !- 연산자도 재정의해야 합니다.

public static bool operator !=(Book left, Book right) => !(left == right);


그러나 아직 객체를 비교하기 위해 아무 것도 하지 않았으므로 Equals 메서드를 재정의해야 합니다.

public override bool Equals(object obj) => obj is Book b && Equals(b);public bool Equals(Book other) => other is object &&  Title == other.Title && Author == other.Author;


그리고 GetHashCodeToString 메서드를 재정의해야 합니다.

public override int GetHashCode() => HashCode.Combine(Title, Author);public override string ToString() => $"{Title} - {Author}";


또한 클래스를 구현IEquatable<T> 인터페이스로 만들어야 합니다.

public class Book : IEquatable<Book>


마지막으로 우리는 단 하나의 간단한 작업을 위해 많은 코드를 작성해야 합니다. 전체 수업:

public class Book : IEquatable<Book>{   public string Title { get; }   public string Author { get; }   public Book(string title, string author)   {       Title = title;       Author = author;   }   public static bool operator ==(Book left, Book right) =>       left is object ? left.Equals(right) : right is null;   public static bool operator !=(Book left, Book right) => !(left == right);   public override bool Equals(object obj) => obj is Book b && Equals(b);   public bool Equals(Book other) =>       other is object &&       Title == other.Title &&       Author == other.Author;   public override int GetHashCode() => HashCode.Combine(Title, Author);}


이제 Console.WriteLine($"book == book2: {isEqual}");true를 출력합니다.

상용구 코드가 많이 있습니다.

또한 새 필드를 추가하면 모든 메서드를 업데이트해야 합니다.
C# 9를 사용하면 동일한 동작에 대해 record 유형을 사용할 수 있습니다. 클래스가 구조인 것처럼 동작을 만들 수 있습니다.

record Book(string Title, string Author)


확장 부분 메서드



이제 부분 메서드에 수정자와 반환 값을 사용할 수 있습니다.

public partial class Book{  public string Title { get; set; }   public string Author { get; set; }  public decimal Price { get; set; }  private partial decimal SetPrice();}public partial class Book{  private partial decimal SetPrice()  {       return 0m;  }}


공변량 반환


C# 9에서 재정의된 메서드에서 파생된 형식을 반환할 수 있습니다.

public class Book{  public string Title { get; set; }   public string Author { get; set; }}public class CollectionBook : Book{  public string Edition { get; set; }}public abstract class BookService{  public abstract Book GetBook();}public class CollectionBookService : BookService{   public override CollectionBook GetBook()    {       return new CollectionBook();    }}


코드: https://github.com/platinum-team/tech-talk-csharp9-features

건배!

좋은 웹페이지 즐겨찾기