표현 본문 멤버를 사용하는 것이 언제 적절한가요? [닫은]


24

C # 6에는 식 본문 멤버가 도입되어 식의 결과 만 반환하는 메서드 및 속성에서 코드를 단순화 할 수 있습니다.

public override string ToString()
{
     return string.Format("{0} {1}", _field1, _field2);
}

된다 :

public override string ToString() =>
    string.Format("{0} {1}", _field1, _field2);

우리는 이제 정확히 두 개의 동등하고 유효한 구문을 가지므로 어떤 규칙을 사용해야 사용할지를 결정해야합니다. 새로운 대안이 언제 적절한가?


7
음, 멤버의 몸이 식일 때?
Jörg W Mittag

1
그것은 "표현식 멤버를 사용할 수있을 때"라는 질문에 대답 할 것입니다.
Asik

7
완전히 관련이 없지만 사용할 수 public override string ToString() => $"{_field1} {_field2}";없습니까?
Thaoden

3
@JorgWMittag 나는 "... 부작용이 없습니다"를 추가합니다. 기능적으로 작동하지 않을 때 기능적 스타일로 메소드를 선언하면 오해의 소지가 있습니다.
Jules

답변:


12

함수형 프로그래밍 언어는 표현식으로 만 구성되므로 대부분 처음부터 이와 같은 기능을 가지고 있습니다. 비교적 짧고 자주 반복되는 표현이있을 때 더 짧고 의미있는 이름으로 대체 할 수있는 경우에 사용합니다.

일반적인 예는 다음과 같이 다른 곳에서 사용되는 술어입니다.

public static bool isOdd(int num) => (num % 2) == 1;

표현식이 너무 길면 별도의 함수 또는 이름이 중간 인 결과가있는 하나의 함수로 나누는 것이 좋습니다. 짧지 만 좋은 이름을 생각할 수 없다면, 끔찍한 이름을 만드는 것보다는 표현식을 복사하는 것이 좋습니다 condition1.


21

에서 의 C # / NET 리틀 불가사의 :. C # 6 식 바디 회원 :

그래서 이것을 사용해야합니까? 그것은 모두 스타일에 달려 있습니다. 내 직감은 이것을 언뜻보기에 명확하게 이해할 수있는 간단한 표현과 진술제한하는입니다.

(강조, 내; 아래 업데이트 1 참조)

위 기사의 요약에서 더 많은 것 :

이제 C # 6은 식으로 get-only 속성 및 메서드 본문을 지정할 수있는 기능을 제공합니다. 이렇게하면 코드를보다 간결하게 만들기 위해 매우 간단한 메서드의 구문 부담을 줄일 수 있습니다.

그러나 모든 상황에서 주어진 상황에 적합한 지 판단하십시오. 식이 매우 길거나 복잡한 경우에도 전신 구문을 사용하는 것이 더 읽기 쉽습니다.

특정 언어 기능을 사용하는 것이 적절한 경우 성능 문제도 발생할 수 있으므로 성능에 대한 또 다른 인용문은 다음과 같습니다.

이제 런타임에 성능에 영향을 미치나요? 실제로 대답은 ' 아니요' 입니다. 이것은 전신을 쓰는 것과 같은 IL로 확장되는 단순히 구문 설탕입니다. 그것은 않습니다 하지 단순히 표현을 초래할 간단한 몸을 쓰는 단순화 람다 식 구문을 빌려, 대리자를 만들 수 있습니다.

(강조, 저자)

업데이트 1 : @ JörgWMittag는 말했다

말이되지 않습니다. "이것은 간단한 표현과 문장으로 제한합니까?" 응? 심지어 표현식에서만 작동합니다!

원저자가 잘못된 것으로 보인 것 같습니다. 명확히하기 위해 새롭고 향상된 C # 6.0에서 :

C # 6.0의 식 본문 함수는 구문 단순화입니다. 이들은 문장 본문이없는 함수입니다. 대신 함수 선언에 따라 표현식으로 구현하십시오.

명확히하기 위해 메서드 또는 속성을 Expression으로 만들지는 않습니다 . Expression 구문 을 사용하여 코드 줄 (및 중괄호 수)을 줄입니다.

내 원래 권장 사항은 여전히 ​​유효합니다. 코드를 사용할 수 있기 때문이 아니라 코드를 명확하고 이해하기 쉽게 만들 때 사용하십시오.


2
이것은 말이되지 않습니다. "이것은 간단한 표현과 문장으로 제한 합니까?" 응? 심지어 표현식에서만 작동 합니다! 나는 또한 확신 아니에요 추가 혼란 (이 괄호와 return키워드 것은) 더욱 가독성을 초래할 수 있습니다. 어쨌든 복잡한 표현은 여전히 ​​똑같은 복잡한 표현이며 구문 혼란에 묻혀 있습니다.
Jörg W Mittag

3
내가 읽은 내용에서 본문 멤버는 실제로 표현식이 아닙니다. 그것들은 구문 설탕입니다. 블로그 게시물 이후 C # 스펙이 변경되지 않은 경우 void 리턴 유형의 메소드를 지원합니다.
Greg Burghardt

1
나는 틀릴 수 있지만 Expression Statements에서 부작용이 허용되지 않는다고 생각합니다. 따라서 표현 문의 장점은 독자에게이 "표현"이 순수하고 독자가 찾아야 할 숨겨진 부작용이 없다는 것을 독자에게 알리는 것입니다.
John

1
@John "disallowed"는 완전히 틀 렸습니다. 활동 선언 세트 구성원 변수 내에서 활동 작성과 같은 모든 shenanigans를 수행 한 다음 활동을 호출 할 수 있습니다. 따라서 부작용은 분명히 허용되지 않습니다. 나는 그것들을 확실히 낙담시킬 것이다. 그들은 표현 구문의 요점을 놓쳤다.
Mafii

@ 마피아. 감사. 나는 "현대"로 묘사 된 "표현식 진술"을 할 수 있다는 것을 알게되었습니다. 그러나 나에게 그 아이디어는 혼란 스러울뿐입니다.
John
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.