programing

getter 전용 자동 속성과 표현식 본문 속성의 차이점은 무엇입니까?

procenter 2021. 1. 15. 19:45
반응형

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

반응형