다른 게터 스타일 사이의 C #의 차이점


154

때로는 getter의 속성에 약어가 표시됩니다. 예를 들어 두 가지 유형이 있습니다.

public int Number { get; } = 0

public int Number => 0;

그 둘 사이에 차이점이 있으면 누군가 말해 줄 수 있습니까? 그들은 어떻게 행동합니까? 둘 다 읽기 전용입니까?

답변:


266

예, 둘 다 읽기 전용이지만 차이가 있습니다. 첫 번째 필드에는 생성자가 실행되기 전에 0으로 초기화되는 백업 필드가 있습니다. 일반 읽기 전용 필드와 마찬가지로 생성자에서만 값을 변경할 수 있습니다 . 게터 자체는 단지 필드의 값을 반환합니다.

두 번째 항목에서는 getter가 필드를 포함하지 않고 매번 0을 반환합니다.

따라서 자동으로 구현 된 속성 또는 식 본문 멤버를 전혀 사용하지 않으려면 다음과 같은 이점이 있습니다.

첫 번째 버전

private readonly int _number = 0;
public int Number { get { return _number; } }

두 번째 버전

public int Number { get { return 0; } }

차이점에 대한보다 명확한 예는 다음과 같습니다.

public DateTime CreationTime { get; } = DateTime.UtcNow;
public DateTime CurrentTime => DateTime.UtcNow;

단일 객체를 생성하면 객체 생성시 CreationTime초기화 된 읽기 전용 필드에 저장되므로 해당 속성은 항상 동일한 결과를 제공합니다. 그러나 CurrentTime속성에 액세스 할 때마다 DateTime.UtcNow평가가 수행되므로 결과가 달라질 수 있습니다.


23
두 번째 버전이 항상 같은 값을 반환하지는 않습니다. 좋은 예는 당신이 돌아 오는 경우 random.NextInt()입니다. 첫 번째 버전은 한 번 평가하고 항상 같은 값을 갖습니다. 두 번째는 매번 새로운 값을 반환합니다.

248

한 가지 차이점은 0개체를 만들 때나 속성을 사용할 때를 평가할 때입니다 .

DateTime 속성을 사용하면 더 잘 볼 수 있습니다.

class SomeTestClass
{
    public DateTime Start { get; } = DateTime.Now;

    public DateTime Now => DateTime.Now;
}

Start속성 Now은 현재 시간을 반영하도록 변경되는 동안 인스턴스가 생성 된 시점과 동일한 시간을 계속 반환합니다 .

설명 :

첫 번째 버전 ( "시작")은 생성자가 덮어 쓸 수도있는 초기 값을 제공합니다. 따라서 이것은 한 번만 평가됩니다.
두 번째 버전 ( "Now")은이 속성의 "getter"가 될 식을 제공합니다. 따라서 이것은 속성을 읽을 때마다 평가됩니다. 생성자가 덮어 쓸 수있는 지원 필드도 없습니다.


26
이것이 내가 생각하는 가장 중요한 차이점입니다.
Matthew

14
허용되는 답변은 예제 코드의 차이점을 가장 정확하게 정의하지만 두 구조의 더 유용한 차이점을 설명합니다.
Kamil Drakari

3
와, 당신은 유명한 존 스케이트보다 더 많은 투표권을 얻었습니다.
machine_1

21

이들은 C # 6 언어 기능입니다.

첫 번째 예

public int Number { get; } = 0

첫 번째 예는 getter-only auto 속성 입니다. 게터 전용 자동 속성의 지원 필드는 암시 적으로 읽기 전용으로 선언됩니다.

두 번째 예

public int Number => 0;

두 번째 예는 속성 유사 함수 멤버의 표현식 본문입니다 . get키워드 는 없습니다 . 표현식 본문 구문을 사용하면 암시됩니다.

둘 다 읽기 전용입니다.


5
...하지만 Jon Skeet이 설명 하듯이 첫 번째 값이 반환하는 값을 변경할 수 있습니다.
마틴 보너 모니카 지원

2
@MartinBonner ...하지만 생성자에서만.
Dennis Kuypers

5
또는 항상 그렇듯이 반사를 통해 (작은 nitpicking)
Marco Mp
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.