2010-08-09 2 views
6
를 사용하는

가능한 중복 :
C# - When to use properties instead of functions때 왜 C#을 접근 방법

이해하려고 할 때, 왜 "게터"와 "세터"

를 사용하는 누군가가 약간의 지침을 제공해 주시겠습니까?

다음 구문 간의 차이점은 무엇입니까? 접근 자 방법에 대해서만 살펴보십시오.

//EXAMPLE 1: simple accessor method 
private static bool _isInitialEditMapPageLoad; 
public static bool isInitialEditMapPageLoad 
{ 
    get {return _isInitialEditMapPageLoad;} 
    set {_isInitialEditMapPageLoad = value;} 
} 

//EXAMPLE 2: accessor method with a conditional test 
private static bool _isInitialEditMapPageLoad; 
public static bool isInitialEditMapPageLoad 
{ 
    get 
    { 
     if (currentSession[isAuthorizedUseder] == null) 
      return false; 
     else 
      return _isInitialEditMapPageLoad;  
    } 
    set {isInitialEditMapPageLoad = value;} 
} 


//EXAMPLE 3: just a get accessor method - is this the same as EXAMPLE 4? 
private static bool _isInitialEditMapPageLoad = false; 
public static bool isInitialEditMapPageLoad 
{ 
    get {return _isInitialEditMapPageLoad;} 
} 


//EXAMPLE 4: simple method 
private static bool _isInitialEditMapPageLoad = false; 
public static bool isInitialEditMapPageLoad 
{ 
    return _isInitialEditMapPageLoad;  
} 
+6

예제 2 당신은 stackoverflow 오류가 있습니다;) 및 예제 4 올바르지 않습니다 – Gregoire

+0

가능한 중복 [C# - 기능 대신 속성을 사용할 때] (http://stackoverflow.com/questions/1374273/c-when-to -use-properties-with-functions)를 사용합니다. – Rob

+0

그걸 보지 못 했어 .. 잘난척. – David

답변

3

1 : 이것은 단순한 속성이며 공용 필드와 거의 같은 방식으로 사용할 수 있습니다. getset 작업을 다른 사용자 (즉, 다른 클래스)에게 노출해야하는 이유가 무엇이든간에 멋진 것은 필요하지 않습니다. 나는 백업 필드 전체 선언을 참조하는 경우 이것은 또한, (

public static bool isInitialEditMapPageLoad {get;set;} // behaves just like example 1 

자동 소품 작성하기가 훨씬 더 빨리 그리고 내 생각에 많은 전체 선언보다 더 많은 읽을 수있는 "자동 등록"을 쓸 수 있습니다 나는 약간의 복잡성을 찾을 것을 기대한다.

2 : 속성에 대한 이유 중 하나를 보여줍니다. 일부 논리를 사용하여 항상 값을 직접 반환하지 않고 값을 반환합니다. 사람들은 언제든지 공개 필드 에서처럼이 값을 설정할 수 있습니다. false은 초기로드가 아니거나 사용자가 승인되지 않았 음을 의미합니다. 즉 값을 반환하기 전에 일부 (단순한) 논리가 수행된다는 의미입니다.

3 : 이것은 읽기 전용으로 공용 필드로 작동합니다. 누군가 값을 검색 할 수는 있지만 설정할 수는 없습니다. 이것은 본질적으로 외부 코드에만 읽히는 값입니다 (readonly 키워드와 혼동하지 마십시오)

4 : 나를 위해 컴파일 오류가 발생했습니다. 메소드 선언이라고 가정하면 자바에서와 같이 수동으로 getter를 정의하면 예제 3과 유사합니다.불행히도이 영역에 대한 지식이 부족하다는 사실을 여러분이 종속 속성 등으로 바꾸고 싶을 때와 같이 완전히 같지 않게 만드는 다른 문제가 있다고 생각합니다.

일반적으로 ==========

, 사용자 속성은 클래스 데이터에 대한 액세스를 제한합니다. 원칙적으로 다른 코드를 만지게 할 수있는 모든 것을 유지해야합니다. 실용적인 문제로서 클래스의 값을 설정하여 클래스의 표시 방법을 변경하고 표시된 데이터를 수정하는 등의 작업을 원할 것입니다. 속성을 사용하여이 상호 작용을 최대한 제어하십시오.

다른 클래스가 클래스에서 뭔가를 볼 필요가 있다면 getter를 노출해야하지만 setter는 노출하지 않아야합니다. 사용자 정의 getter 메소드를 작성하는 Java 메소드를 사용하지 않는 한 필드에서는이 작업을 수행 할 수 없습니다. 또한 데이터를 반환하거나 설정하기 전에 계산 또는 유효성 검사를 수행 할 수 있습니다. 예를 들어 어떤 범위 (객체의 상태에 따라 변경 될 수있는 범위) 내에 있어야하는 정수 값이있는 경우 setter에서 값을 실제로 업데이트하기 전에이 조건이 충족되는지 확인할 수 있습니다 .

모든 것을 자동 프로펠러로 설정하는 함정을 피하십시오. 모든 것을 공개 입력란으로 만드는 것과 다르지 않습니다. 최대한 비공개로 유지하십시오. 필요한 경우를 제외하고는 getter가없고, 필요한 경우 setter가 없으며 setter는 적절한 경우 입력을 확인하기 전에 입력을 확인하는 데 필요한 작은 논리를 수행해야합니다. 즉, getter/setter에 많은 코드를 넣는 등 다른 함정을 피하십시오. 소수의 라인이 필요하다면 속성이 아닌 메소드를 작성해야합니다. 단순히 코드를 사용하는 다른 사람들에게 커다란 일이 일어날 것이라는 힌트를주기 때문입니다.

8

getter/setter는 수업에 대한 공개 인터페이스 여야합니다. 엄지 손가락의 규칙으로

, 당신의 모든 회원은 사람들이 클래스의 외부에 액세스 할 수 있도록하려면 무엇을 제외하고 개인해야하며, 당신은 당신의 클래스 경우 private 변수는 외부에서 직접 액세스 할 수 싶지 않을

다음은 간단한 예입니다. 변수가 age 인 클래스가 있다고 가정 해보십시오. 이 경우, 외부 클래스가 값의 유효성을 확인해야 할 필요없이 세터에서 유효성 검사를 바로 수행 할 수 있습니다.

class Person { 
    int age = 0; 

    public int Age { 
    get { return age; } 
    set { 
     //do validation 
     if (valid) { 
     age = value; 
     } 
     //Error conditions if you want them. 
    } 
    } 

    //More getters/setters 
} 
5

게터/세터 뒤에 추론은 사용자가 잘못된 방법으로 필드를 변경 할 때 파손되는 클래스를 보호하는 것입니다, 그들은 변화 공개적으로 노출 특성을 유지하면서 당신이 당신의 클래스의 구현을 변경할 수 있습니다 .

일종의 유효성 검사 또는 지연로드 된 속성이 필요한 경우가 아니면 일반적으로 자동 속성 만 사용할 수 있습니다.

public string Name { get; set; } 
2

다른 언급과 마찬가지로 객체 구성원을 다른 객체에서 사용할 수있게하려면 getters/setters를 사용하십시오.

또한 autoproperties를 사용하여 yoru 코드의 가독성을 향상시킬 수 있습니다 (.NET 2.0 이상인 경우). 예를 들면 다음과 같습니다.

// example 1 
public static bool IsInitialEditMapPageLoad { get; set; } 

// example 3/4 - note that false is the default for bools 
public static bool IsInitialEditMapPageLoad { get; private set; } 

예제 3은 유효성 검사 로직이 있기 때문에 동일하게 유지 될 것입니다.

관련 문제