2011-11-01 2 views
1

내가 코딩 된 클래스 설정시 특별한 조치가없는 C#을 필드 :{get; 세트; } 점점이 같은

public class ReportViewModel 
    { 
     public string Status; 
     public string DataSource; 
     public String DataStore { get; set; } 
     public PageMeta PageMeta { get; set; } 
     public ICollection<Question> List { get; set; } 
    } 

참고하는 대부분의 필드 수 {사용; 세트; } Visual Studio에서 나를 추가하도록 한 첫 번째 두 가지를 제외하고.

궁금한 점은 {get; 세트; }. VS2010이 자동으로 추가하지 않으므로 필요합니까?

+0

[C#의'필드 '와'속성 '의 차이점은 무엇입니까?] (http://stackoverflow.com/questions/4446929/what-is-the-difference-between-fields-and- properties-in-c) –

+0

@ FrédéricHamidi - 연결할 가치가 있지만,이 질문자가 다른 방향에서 그 문제를 제기하고 있다고 생각합니다. 따라서이 질문은 별도의 질문으로 가치를 더합니다. – Keith

+0

[C# .NET 3.5+의 속성과 필드의 차이점] 중복 가능 (http://stackoverflow.com/questions/653536/difference-between-property-and-field-in-c-sharp-net-3- 5) – nawfal

답변

2

{ get; set; }은 자동 구현 속성을 나타냅니다. .NET에서는 propertiesfields 사이에 차이가 있습니다. 일반적으로 필드는 비공개이어야합니다. 이 클래스는 특정 구현에 사용되며 대부분의 경우 클래스 내부에 있어야합니다. 반면에 속성은 소비자에게 노출되는 동작을 캡슐화하는 데 사용됩니다.

+0

Hello Darin, 이것들은 MVC3 뷰 모델에서 사용된다는 것과 로직이 필요없는 "멍청한"것이라는 점을 생각하면 필드로 사용하는 것만으로도 큰 차이가 있다고 생각하십니까? –

+0

@SamanthaJ, 이제 ASP.NET MVC에 관한 주제를 가져 왔으므로 항상 뷰 모델에서 속성을 사용해야합니다. 기본 모델 바인더는 필드에 바인딩 할 수 없습니다. –

+0

기본 모델 바인더의 의미를 설명 할 수 있습니까? 나는 다음과 같은 작업을하고있다 : ViewModel 파일 : public class ReportViewModel { public string Status; 등 등 ... CSHTML 파일 : @model xxx.ReportViewModel

@Model.Status

2

속성으로 적절하게 표시하려면 '예'를 선택하십시오.

1

그들은 다릅니다 : 귀하의 처음 두 회원은 fields - properties이 아닙니다. 나머지는 자동 구현 접근자를 가진 속성입니다.

6

두 공공 필드 (StatusDataSource)와 세 개의 공공 특성 (DataStore, PageMetaList)와 클래스를 만들었습니다. 공개 필드를 사용하지 말 것을 권하고 실제로는 이 실제로에 모두 변경 가능한 속성이 필요한지 여부를 고려해야합니다.

various advantages to using properties over public fields이 있지만, 논리적으로 클래스의 API의 일부인 반면 속성은 논리적으로 구현 세부 사항입니다. 속성은 이라고 말합니다. 발신자가 할 수있는 것은 입니다. 값이 저장되어 있습니다.

+0

public get 및 set과 함께이 경우와 같이 정말로 "멍청한"속성이있는 경우 속성 대신 public 필드를 사용하는 데 단점이 있습니까? –

+4

@TomasJansson : 내가 대답 한 페이지를 읽었습니까? –

+0

링크가 빠졌지 만 지금은 읽었습니다. 훌륭한 설명! –

1

을 당신이 가져 오기를 추가하고 필드보다는 속성을 사용하는 설정하지 않는 경우. 많은 경우에 많은 차이를 내지 않을 것입니다. 그러나 속성을 사용하여 할 수있는 것처럼 필드에 데이터 바인딩 할 수는 없습니다. 그래서 당신은 그것을 잃을 것입니다.

1

차이가 있습니다. 처음 두 개는 fields이고 나머지는 auto-properties입니다.

두 번째 컴파일러는 개인용 백업 필드와 일부 보일러 플레이트 get/set 메서드를 생성합니다. 그러면 필드와 같은 속성에 액세스 할 수 있지만 속성에서만 사용할 수있는 이점이 있습니다.

비공개로 설정하고 주변에 자신의 속성을 쓰거나 자동 속성을 사용하여 속성 뒤에있는 필드를 숨기는 것이 좋습니다.

속성에는 몇 가지 장점이 있습니다. 하나는 속성이 읽기 전용으로 작성되거나 쓰기 전용으로 작성되거나 내부 쓰기 전용으로 읽기 전용으로 만들어 질 수 있다는 것입니다. 메소드와 마찬가지로 작동하기 때문에 내부에서 임의의 코드를 실행할 수 있습니다.이것은 INotifyPropertyChanged 같은 것을 구현해야하거나 속성이 실제로 그 뒤에있는 여러 필드에서 계산되는 경우 유용합니다.

다른 장점은 캡슐화입니다. 당신은 학급의 들판에 직접 묶이지 않고 오히려 그 소유지에 직접 묶여 있습니다. 따라서 필드 변경에 대한 세부 사항이 사라지면 (계산이 사라짐) 속성을 사용하여 해당 구현 세부 정보에서 자신을 격리합니다.

모든 경우에 대해 속성 (지금은 { get; set; } 추가)을 사용해야합니다. 구현 세부 사항으로부터 사용자를 보호하는 캡슐화 수준을 제공한다는 점에서 우수 사례입니다.

1

이 클래스의 사용 방법에 따라 다릅니다.

이 코드가 현재 제품에만 사용 된 경우 필드()와 등록 정보() 사이에는 별다른 차이가 없습니다.

그러나 그 경우에는 public이 아니어야합니다. 외부 코드에서 사용해서는 안되기 때문에 internal 또는 private으로 변경해야합니다.

클래스가 다른 어셈블리에서 사용되는 경우 공용 필드를 항상 속성으로 변환해야합니다.

나중에 속성을 확장 (즉, set에 본문 추가)하면 사용자가 새 DLL을 얻을 수 있기 때문입니다. 그러나 필드를 사용한 경우 속성으로 변환하면 IDE에서 동일하게 보이지만 변경된 DLL을 가져올 때 사용자가 다시 컴파일해야합니다.

public은 소비자가 그 회원이있는 것을 의지 할 수 있음을 소비자에게 알려주며, 재산은 귀하에게 어떻게 전달할 것인지를보다 잘 제어합니다.