그의 훌륭한 저서 인 CLR Via C #에서 Jeffrey Richter는 속성을 좋아하지 않으며 사용하지 말 것을 권장한다고 말했습니다. 그는 어떤 이유를 줬지만 나는 정말로 이해하지 못한다. 왜 내가 속성을 사용하거나 사용하지 말아야하는지 설명해 줄 수 있습니까? 자동 속성을 사용하는 C # 3.0에서 이것이 변경됩니까?
참고로 Jeffrey Richter의 의견을 추가했습니다.
• 속성은 읽기 전용이거나 쓰기 전용 일 수 있습니다. 필드 액세스는 항상 읽고 쓸 수 있습니다. 속성을 정의하는 경우 get 및 set 접근 자 메서드를 모두 제공하는 것이 가장 좋습니다.
• 속성 메서드에서 예외가 발생할 수 있습니다. 필드 액세스는 예외를 발생시키지 않습니다.
• 속성은 out 또는 ref 매개 변수로 메서드에 전달할 수 없습니다. 필드는 할 수 있습니다. 예를 들어 다음 코드는 컴파일되지 않습니다.
using System;
public sealed class SomeType
{
private static String Name
{
get { return null; }
set {}
}
static void MethodWithOutParam(out String n) { n = null; }
public static void Main()
{
// For the line of code below, the C# compiler emits the following:
// error CS0206: A property or indexer may not
// be passed as an out or ref parameter
MethodWithOutParam(out Name);
}
}
• 속성 메서드를 실행하는 데 시간이 오래 걸릴 수 있습니다. 필드 액세스는 항상 즉시 완료됩니다. 속성을 사용하는 일반적인 이유는 스레드 동기화를 수행하기위한 것이므로 스레드를 영원히 중지 할 수 있으므로 스레드 동기화가 필요한 경우 속성을 사용하지 않아야합니다. 이러한 상황에서는 방법이 선호됩니다. 또한 클래스에 원격으로 액세스 할 수있는 경우 (예 : 클래스가 System.MashalByRefObject에서 파생 됨) 속성 메서드 호출이 매우 느리므로 속성보다 메서드가 선호됩니다. 제 생각에는 MarshalByRefObject에서 파생 된 클래스는 속성을 사용해서는 안됩니다.
• 연속적으로 여러 번 호출되는 경우 속성 메서드는 매번 다른 값을 반환 할 수 있습니다. 필드는 매번 동일한 값을 반환합니다. System.DateTime 클래스에는 현재 날짜와 시간을 반환하는 readonly Now 속성이 있습니다. 이 속성을 쿼리 할 때마다 다른 값이 반환됩니다. 이것은 실수이며 Microsoft는 Now를 속성 대신 메서드로 만들어 클래스를 수정할 수 있기를 바랍니다.
• 속성 방법은 관찰 가능한 부작용을 일으킬 수 있습니다. 필드 액세스는 절대하지 않습니다. 즉, 유형의 사용자는 유형의 다른 동작을 인식하지 않고 자신이 선택한 순서대로 유형에 정의 된 다양한 속성을 설정할 수 있어야합니다.
• 속성 메서드에는 추가 메모리가 필요하거나 실제로 객체 상태의 일부가 아닌 항목에 대한 참조를 반환 할 수 있으므로 반환 된 객체를 수정해도 원래 객체에는 영향을주지 않습니다. 필드를 쿼리하면 항상 원래 개체 상태의 일부가 보장되는 개체에 대한 참조가 반환됩니다. 복사본을 반환하는 속성으로 작업하는 것은 개발자에게 매우 혼란 스러울 수 있으며이 특성은 종종 문서화되지 않습니다.