2012-11-27 2 views
1

가능한 중복 :
Difference between Property and Field in C# .NET 3.5+
Why should I use an automatically implemented property instead of a field?부동산을 사용할 수있는 이유는 무엇입니까?

아래의 두 예는 동일한 액세스 내에서 클래스의 외부 기록이 ... 왜 모두가 동일 보인다 않습니다 실시 예 2와 함께 실시 예 1을 사용 하는가? 나는 뭔가를 놓친 것 같아요.하지만 지금은 저를 괴롭 히고 있습니다. 나는 명확한 답을 찾을 수 없었습니다.

class SampleClass 
{ 
    /// Example 1 
    /// Shown by online examples. 
    /// Why use a Field AND a Property where you could just use Example 2? 
    private int age; 
    public int Age { get { return age; } } 
    private void setAge() 
    { 
     age = 1; 
    } 

    /// Example 2 
    /// Tidier code and better understanding of how Age2 can be accessed. 
    /// Personally I prefer this method, though am I right to use it over Example 1? 
    public int Age2 { get; private set; } 
    private void setAge2() 
    { 
     Age2 = 1; 
    } 
} 
+2

해당 사본이 유효하지 않습니다. 그는 필드와 속성을 사용해야하는지 묻지 않고 수동 구현 속성과 자동 구현 속성을 묻습니다. – Servy

+1

@OP 또한 자동 구현 된 속성은 C# 3.0에 도입되었지만 속성은 C# 1.0 이후 언어로되어 있습니다. 수동으로 정의 된 속성의 많은 예제는 오래된 코드 샘플이나 새로운 구문에 익숙하지 않은 (또는 아직 사용하지 않은) 사람들로부터 왔습니다. 물론 자동 소품이 수동으로 할 수없는 경우도 있지만, 게시 한 예는 사실이 아닙니다. – Servy

+0

이것은 아마도 내가 가장 고심하고, 새로운 것이고, 더 나은 실천이 무엇인가? 이전 .NET 버전에서는 예제 2를 사용할 수 없었으며 동일한 효과를 얻으려면 예제 1이 필요했습니다. 예제 2를 사용하면 예제 1에서 필자의 코드를 불필요하게 부풀리지 않고보다 현대적인 구문을 사용하고 있다는 것을 안심할 수 있습니다. – Robula

답변

0

내가 VS2008 이상을 사용하고 있습니다 및 VS2005에서 그것을 컴파일 가능한 필요가없는 경우, .

private string _someProperty; 
public string SomeProperty 
{ 
    get { return _someProperty; } 
    set 
    { 
     _someProperty = value; 
     OnPropertyChanged("SomeProperty"); 
    } 
} 

하지만 내가 뒷받침 필드를 가지고 있어도 일관성을 위해 속성을 통해 값을 설정합니다.

+0

고마워요. 이것은 내가 한 일이나 생각한 것이 아닙니다. INotifyPropertyChanged는 속성이 변경 될 때 이벤트를 트리거하는 인터페이스라고 가정합니다. 미숙하다면 실례합니다. – Robula

+0

MVVM 패턴을 사용하여 WPF로 작업 할 때 정확하게 사용됩니다. 기본적으로이 패턴을 사용하면 ViewModel 클래스를 만들고 View는 ViewModel의 속성에 바인딩됩니다. 뷰는 PropertyChanged 이벤트를 등록하므로 ViewModel의 값이 변경되면 뷰는 새 컨트롤로 적절한 컨트롤을 업데이트 할 수 있습니다. – taylorjonl

+0

정말 고맙습니다. :디 – Robula

1

속성 설정자 또는 getter에서 실제 기능을 제공하려면 백킹 필드를 사용해야합니다. 예를 들어, 설정자에 대한 유효성 검사를 원하면 backing 필드를 사용해야합니다.

public class MyClass 
{ 
    private string myString = "blah"; 

    public string MyNotNullString 
    { 
     get 
     { 
      return this.myString; 
     } 
     set 
     { 
      if (value == null) 
      { 
       throw new ArgumentNullException("Cannot set MyNotNullString to null"); 
      } 
      this.myString = value; 
     } 
    } 
} 
0

내가 @Platinum 푸른 답변에서와 같이 필드를 필요한 상황이 있었다 ... 않는 정연 요인에 대한 때마다 가능하면 내가 예 2를 사용합니다.

Example1에서 생각할 수있는 유일한 다른 이점은 값을 변경하는 사람을 빠르게 찾을 수있는 방법으로 getter 또는 setter 메서드에 중단 점을 설정할 수 있다는 것입니다.

public string SomeProperty { get; set; } 

하지만 가끔은 당신이 특히 당신이에서 INotifyPropertyChanged를 구현하는 경우, 배킹 필드가 필요합니다 : 나는 속기를 사용하거나 일반적으로

+0

흠. 이 모든 것을 염두에두고 필자가 이해하는 방식은 진술하는 클래스 내의 변수/개체에 적합합니다. 속성은 적절한 읽기/쓰기 액세스 수정자를 사용하여 진술 클래스 외부의 변수/객체를 안전하게 노출해야하는 경우 즉각적인 이점이 있습니다. 여기에 맞습니까? :) – Robula

+0

오, 나는 이것이 Field vs. Property 질문이라는 것을 깨닫지 못했다. 당신이 auto-property를 {get; set;}과 property-with-backing-field를 비교한다고 가정했다. 음, 이상적으로, 필드는 비공개이어야하며 가능하다면 프로퍼티는 자동 소품을 사용합니다 ... 그것은 어쨌든 내 방식입니다. – demoncodemonkey

+0

그것은 ... 나는 필드의 사용을 포함하거나 포함하지 않는 더 건전한 일을 어떻게해야하는지에 대한 이해를 이해하려고 노력하는 초보자에 불과합니다.이것을 묻기 전에 나는 "자동"속성에 대해 들어 본 적이 없었다. 왜 내가 뒷받침 필드가 필요한지 아직 확실치 않지만 어쩌면 내 기술이 향상되고 필요가 생길 때 요구 사항이 무엇인지 깨닫게 될 것입니다. 당장은 내 대답을 믿는다. 감사합니다. – Robula

관련 문제