getter 전용 자동 속성과 표현식 본문 속성의 차이점은 무엇입니까?
C # 6에서는 getter 전용 auto 속성을 사용하여 속성 구현을 단순화 할 수 있습니다. 예를 들어 추상 Stream
클래스를 구현하는 경우 :
public override bool CanRead { get; } = true;
그러나 C # 6의 새로운 기능인 식 본문으로도 작성할 수 있습니다.
public override bool CanRead => true;
둘의 차이점은 무엇이며 언제 둘 중 하나를 사용해야합니까?
그들은 두 가지 다른 것에 대한 통사론 적 설탕입니다. 전자는 지원 필드를 초기화하고 필드 초기화 중에 할당의 오른쪽에있는 표현식으로 설정합니다. 후자 get
는 표현에있는 것과 정확히 일치 하는를 만듭니다 .
public override bool CanRead { get; } = true;
다음과 같다
private readonly bool __backingFieldCanRead = true;
public override bool CanRead
{
get
{
return __backingFieldCanRead;
}
}
이
public override bool CanRead => true;
다음과 같다
public override bool CanRead
{
get
{
return true;
}
}
그들은 다르게 행동합니다. 첫 번째 경우는 객체가 생성되고 필드가 초기화 될 때 속성 값을 설정하고, 다른 경우는 속성의 getter가 호출 될 때마다 식을 평가합니다. bool의 간단한 경우에는 동작이 동일합니다. 그러나 표현이 부작용을 일으키면 상황이 다릅니다. 이 예를 고려하십시오.
class Program
{
static void Main(string[] args)
{
var fooBar1 = new FooBar();
Console.WriteLine(fooBar1.Baz);
Console.WriteLine(fooBar1.Baz);
var fooBar2 = new FooBar();
Console.WriteLine(fooBar2.Baz);
Console.WriteLine(fooBar2.Baz);
}
}
public class FooBar
{
private static int counter;
public int Baz => counter++;
}
여기에는 "0, 1, 2, 3"이 인쇄됩니다. 정적 counter
필드는 속성의 getter가 호출 될 때마다 증가합니다. 그러나 속성 이니셜 라이저를 사용하면 :
public int Baz { get; } = counter++;
그러면 표현식이 객체의 생성자에서 평가되기 때문에 "0, 0, 1, 1"이 인쇄됩니다.
이 예에서 설명하는 경우 다음을 선호했습니다.
public override bool CanRead { get; } = true;
But today I notified that this implementation cause a memory allocation for the backing field. And so, this implementation: bool CanRead => true;
can save 4 bytes.
ReferenceURL : https://stackoverflow.com/questions/27910985/what-is-the-difference-between-getter-only-auto-properties-and-expression-body-p
'programing' 카테고리의 다른 글
재귀 적으로 scp를 사용하지만 일부 폴더는 제외 (0) | 2021.01.15 |
---|---|
Microsoft.Web.Administration을 참조하는 방법은 무엇입니까? (0) | 2021.01.15 |
ASP.NET Core MVC 개발에 AddMvc 또는 AddMvcCore를 사용해야합니까? (0) | 2021.01.15 |
어떤 Eclipse Subversion 플러그인을 사용해야합니까? (0) | 2021.01.15 |
NHibernate 스키마 생성으로 데이터베이스 테이블 스키마를 업데이트하는 방법은 무엇입니까? (0) | 2021.01.15 |