때로는 getter의 속성에 약어가 표시됩니다. 예를 들어 두 가지 유형이 있습니다.
public int Number { get; } = 0
public int Number => 0;
그 둘 사이에 차이점이 있으면 누군가 말해 줄 수 있습니까? 그들은 어떻게 행동합니까? 둘 다 읽기 전용입니까?
답변
예, 둘 다 읽기 전용이지만 차이가 있습니다. 첫 번째 필드에는 생성자가 실행되기 전에 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
평가가 수행되므로 결과가 달라질 수 있습니다.
답변
한 가지 차이점은 0
개체를 만들 때나 속성을 사용할 때를 평가할 때입니다 .
DateTime 속성을 사용하면 더 잘 볼 수 있습니다.
class SomeTestClass
{
public DateTime Start { get; } = DateTime.Now;
public DateTime Now => DateTime.Now;
}
이 Start
속성 Now
은 현재 시간을 반영하도록 변경되는 동안 인스턴스가 생성 된 시점과 동일한 시간을 계속 반환합니다 .
설명 :
첫 번째 버전 ( “시작”)은 생성자가 덮어 쓸 수도있는 초기 값을 제공합니다. 따라서 이것은 한 번만 평가됩니다.
두 번째 버전 ( “Now”)은이 속성의 “getter”가 될 식을 제공합니다. 따라서 이것은 속성을 읽을 때마다 평가됩니다. 생성자가 덮어 쓸 수있는 지원 필드도 없습니다.
답변
이들은 C # 6 언어 기능입니다.
첫 번째 예
public int Number { get; } = 0
첫 번째 예는 getter-only auto 속성 입니다. 게터 전용 자동 속성의 지원 필드는 암시 적으로 읽기 전용으로 선언됩니다.
두 번째 예
public int Number => 0;
두 번째 예는 속성 유사 함수 멤버의 표현식 본문입니다 . get
키워드 는 없습니다 . 표현식 본문 구문을 사용하면 암시됩니다.
둘 다 읽기 전용입니다.