readonly modifier와 private setter 중 어느 것이 더 낫습니까?
저는 수업을 만드는 과정에서 갑자기 두 코드의 차이점이 무엇인지 생각했습니다.
public readonly string ProductLocation;
과
public string ProductLocation
{
get;
private set;
}
다음을 더 잘 사용할 때 아이디어를 줄 수 있습니까? 감사.
첫 번째 필드는 읽기 전용 필드이고 두 번째 필드는 메서드 쌍으로 ProductLocation
컴파일되고 속성의 모든 읽기 는 해당 get
메서드 에 대한 호출로 컴파일되고 쓰기는 set
메서드 호출로 컴파일됩니다 . 내부적으로 이러한 메서드는 내부의 자동 생성 된 읽기 전용이 아닌 필드에서 읽거나 씁니다. 가장 중요한 차이점은 스레드 안전성입니다 ! (어떻게? 계속 읽어보세요!)
클래스의 기본 사용법은 정확히 동일 하게 보일 것 입니다. 다른 클래스의 코드는 값을 읽을 수만 있고 변경할 수는 없습니다. 또한 값을 읽는 코드는 정확히 동일하게 보입니다 (예 print(myInstace.ProductLocation)
: 여기에서는 어떻게 선언되었는지 알 수 없습니다. cool, eh?)
첫 번째, 가장 사소한 차이점은 private setter가있는 속성은 동일한 클래스의 인스턴스가 값을 수정할 수 있도록 허용하는 반면, readonly 속성의 경우 개체 자체도 값을 변경할 수 없다는 것입니다.
이제 스레드 안전성을 위해. readonly
필드 의 속성은 여러 스레드로 작업 할 때 (Java의 final
필드 처럼) 메모리 가시성 의미를 변경합니다 .
readonly
필드는 선언 또는 생성자에서 할당 할 수 있습니다. 필드에 할당 된 값 readonly
은 변경할 수 없으며 (적어도 정상적인 방식은 아님) 생성자가를 반환 한 후 모든 스레드가 올바르게 초기화 된 값을 볼 수 있습니다. 따라서 readonly
필드는 본질적으로 스레드로부터 안전합니다.
속성으로 동일한 스레드 안전성을 얻으려면 코드에 동기화를 추가해야하므로 오류가 발생하기 쉽습니다. 경우에 따라 특히 경험이없는 경우 교착 상태, 데이터 경합 또는 성능 저하로 이어질 수 있습니다.
따라서 값 이 객체 생성 후 의미 상 변경할 수없는 것을 나타내는 경우 개인 setter를 선언해서는 안됩니다 (이는 객체가 변경할 수 있음을 의미 함). 읽기 전용 필드로 이동 (그리고 private으로 선언하고 필드에 액세스하는 getter 만 사용하여 공용 속성을 선언 할 수 있습니다! 필드를 노출하는 것이 좋지 않기 때문에 실제로 선호되는 형식이므로 메서드 만 노출하는 것이 좋습니다. 이 답변 에서 이유를 설명하는 많은 이유가 있습니다 )
C # 6.0 자동 속성 이니셜 라이저를 사용하면 보일러 플레이트 방식이 줄어 듭니다.
private readonly string productLocation;
public string ProductLocation { get { return productLocation; } }
어느 것이
public string ProductLocation { get; }
이것은 읽기 전용입니다. 생성자 또는 인라인에서만 초기화됩니다. 초기화 후에는 편집 할 수 없습니다. (어디에서나 불변)
그러나 개인 세트를 사용하는 경우;
public string ProductLocation { get; private set }
외부에서 읽기 전용입니다. 그러나 언제 어디서나 클래스 자체에서 초기화 할 수 있습니다. 그리고 클래스 자체에서 라이프 사이클 내에서 편집 할 수 있습니다. (클래스에서 변경 가능, 외부에서 변경 불가능)
일반적으로 .NET에서는 멤버 필드를 공개적으로 노출하는 것이 권장되지 않으며 속성으로 래핑해야합니다. 그래서 당신이 가질 수 있다고 가정합시다
private readonly string productLocation;
public string ProductLocation { get { return productLocation; } }
vs
public string ProductLocation { get; private set; }
이 설정에서 리플렉션을 통해 수행 할 수있는 작업을 무시하면 의미론은 첫 번째 경우 productLocation
변수가 제자리와 클래스 생성자에서만 초기화 될 수 있다는 것입니다. 클래스의 다른 멤버는 값을 변경할 수 없습니다. 외부 소비자는 값을 설정할 수 없습니다.
두 번째 버전에서는 외부 소비자가 값 설정에 계속 액세스 할 수 없습니다. 그러나 클래스 자체는 언제든지 값을 변경할 수 있습니다. 가지고있는 것이 DTO (즉, 데이터 만 전송하는 클래스이며 메서드를 통해 표현 된 논리가 없음) 뿐이라면 기본적으로 readonly
버전 과 크게 다르지 않습니다 . 그러나 메서드가있는 클래스의 경우 이러한 메서드는 뒤에있는 값을 변경할 수 있습니다 ProductLocation
.
구성 후 불변 필드의 개념을 적용하려면 readonly
. 그러나 DTO의 경우 private set;
주로 상용구 코드가 적기 때문에 옵션을 선택할 수 있습니다 .
첫 번째 항목 (사용 readonly
)은 개체가 인스턴스화되면 개체가 자신의 필드 값을 수정할 수도없고 다른 개체는 수정할 수 없음을 의미합니다.
(사용하여 두 번째는 private set
) 개체가 있음을 의미합니다 수 인스턴스화되어있어 이후의 필드의 값을 수정할 수 있지만 다른 사람은 수정할 수 없다.
전자는 변경되지 않을 것이라는 것을 알고 후자는 값이 변경 될 수 있지만 다른 사람이 변경하는 것을 원하지 않는 경우에 사용합니다.
첫 번째는 인스턴스화시에만 값을 설정할 수 있는 필드 입니다 .
두 번째는 값을 언제든지 설정할 수 있는 속성 입니다 (포함하는 객체에 의해서만 가능).
수정 :이 속성은 동일한 클래스의 모든 인스턴스에 의해 언제든지 설정 될 수 있습니다 (포함하는 객체뿐만 아니라).
ReferenceURL : https://stackoverflow.com/questions/7975661/which-is-better-between-a-readonly-modifier-and-a-private-setter
'developer tip' 카테고리의 다른 글
PHP const 배열 (0) | 2020.12.24 |
---|---|
Winforms : Application.Exit 대 Enviroment.Exit 대 Form.Close (0) | 2020.12.24 |
JavaScript 객체에서 키를 정렬 / 순서화하는 방법이 있습니까? (0) | 2020.12.15 |
C #을 사용하여 Excel 파일에서 데이터를 읽는 방법 (0) | 2020.12.15 |
Twitter Bootstrap 테이블 셀에 collapse.js 사용 [거의 완료] (0) | 2020.12.15 |