식 본문 멤버로 C# 단순화

구문을 단순화할 수 있습니다



C#은 구문을 단순화하고 코드를 보다 표현적으로 만드는 방식으로 지속적으로 발전하기 때문에 환상적인 언어입니다. Expression-bodied 멤버는 C# 6에서 릴리스되었으며 C# 7에서 더욱 향상되었습니다. 당시 저는 아직 주니어 개발자였으며 ​​C#과 .NET이 저의 장기적인 초점이 될 것이라고 아직 결정하지 못했습니다.

이 기능이 나와 .NET의 "거래를 봉인"했다고 말하지는 않겠지만 다른 언어를 사용할 때 가장 그리워하는 기능입니다.

단순 식 본문 멤버



가장 간단한 형식은 기존 읽기 전용 속성을 가져와 압축하는 것입니다.

public int MyProperty
{
  get 
  {
    return _myField;
  }
}


다음과 같이 됩니다.

public int MyProperty => _myField;


간단한 메서드 본문에도 사용할 수 있습니다.

public decimal CalculateTax(decimal rate) => _totalPrice * rate;


시간을 절약하고 화면의 공간을 절약합니다. 대부분의 C# 스타일 규칙은 여는 대괄호{와 닫는 대괄호}가 새 줄에 속한다고 말합니다(일부 예외 있음). 스타일 가이드와 논쟁을 벌일 수 있지만 더 큰 팀에서는 아마도 지는 전투일 것입니다. 이 기능은 대괄호를 완전히 생략하여 이 문제를 해결합니다.

표현 본문 회원은 상용구를 줄이는 데 도움이 될 수 있습니다.



아직 감동하지 않았습니까? 전체 속성에 식 본문 멤버를 사용할 수 있다고 말하면 어떻게 될까요?

private int _myField;

public int MyProperty 
{
  get => _myField; 
  set => _myField = value;  
}


꽤 훌륭하지만 getter/setter를 호출할 논리가 없으면 솔직히 인상적이지 않습니다.

private int _myField;

private void SetField(ref int field, int value, [CallerMemberName]string memberName =  "")
{
  field = value;
  Console.WriteLine($"{memberName} was set to {value}.");
}

public int MyProperty
{
  get => _myField;
  set => SetField(ref _myField, value);
}

// Output for "MyProperty = 5"
// MyProperty was set to 5.


표현식 본문 멤버는 생성자에서 사용할 수 있습니다.



C#에서 얻을 수 있는 가장 반복적인 상용구는 생성자에서 클래스 필드를 설정하는 것입니다.

public class Cake
{
  private readonly IFrosting _frosting;

  public Cake(IFrosting frosting) => _frosting = frosting;
}


이것은 단일 할당 생성자를 크게 단순화합니다. 그러나 한 번에 여러 할당을 수행하기 위해 이것을 튜플 구문과 결합할 수도 있습니다.

public class Cake
{
  private readonly ISprinkles _sprinkles;
  private readonly IFrosting _frosting;

  public Cake(ISprinkles sprinkles, IFrosting frosting)
    => (_sprinkles, _frosting) = (sprinkles, frosting);
}


이 구문은 튜플에 나타나는 순서대로 필드를 할당합니다.

참고: 매개변수가 모두 유사한 유형(예: string )인 경우 이 구문을 사용하면 잘못된 순서로 매개변수를 쉽게 얻을 수 있습니다. 그러나 다른 유형의 필드는 컴파일에 의해 포착됩니다. 따라서 다양한 필드 집합을 할당할 때만 권장합니다.

내가 C#에서 가장 좋아하는 기능 중 하나에 대한 이 간략한 개요를 즐겼기를 바랍니다!

좋은 웹페이지 즐겨찾기