문제

빠른 질문 : 언제 C#에서 속성을 사용하기로 결정하고 언제 방법을 사용하기로 결정합니까?

우리는이 토론을 하느라 바쁘고 재산이나 방법을 사용해야하는지 논쟁의 여지가있는 일부 영역을 발견했습니다. 한 가지 예는 다음과 같습니다.

public void SetLabel(string text)
{
    Label.Text = text;
}

예에서 Label ASPX 페이지의 컨트롤입니다. 결정을 지배 할 수있는 원칙이 있습니까 (이 경우) 이것을 방법으로 만들 것인지 또는 재산을 만들 것인지 여부가 있습니까?

나는 가장 일반적이고 포괄적 인 대답을 받아 들일 것이지만, 그것은 내가 준 예제에도 영향을 미칩니다.

도움이 되었습니까?

해결책

로부터 속성과 방법 중에서 선택합니다 클래스 라이브러리 개발을위한 설계 지침 섹션 :

일반적으로 방법은 동작을 나타내고 속성은 데이터를 나타냅니다. 특성은 필드처럼 사용되어야합니다. 즉, 속성은 계산적으로 복잡하거나 부작용을 생성해서는 안됩니다. 다음 지침을 위반하지 않으면 경험이 적은 개발자가 사용하기 쉽기 때문에 방법이 아닌 속성 사용을 고려하십시오.

다른 팁

예, 당신이하는 일이 끝나고 설정하는 경우 속성을 사용하십시오.

여러 데이터 구성원에게 영향을 줄 수있는 복잡한 일을하는 경우 방법이 더 적절합니다. 또는 getter가 매개 변수를 가져 오거나 세터가 값 매개 변수 이상을 가져 오는 경우.

중간에는 선이 약간 흐려질 수있는 회색 영역이 있습니다. 단단하고 빠른 규칙은 없으며 다른 사람들은 때때로 무언가가 재산인지 방법이어야하는지에 동의하지 않을 것입니다. 중요한 것은 (또는 팀이 어떻게하는지)하십시오.

그것들은 크게 상호 교환 가능하지만 구현이 비교적 "간단한"것으로 사용자에게 속성 신호를 보냅니다. 아 그리고 구문은 조금 더 깨끗합니다.

일반적으로 내 철학은 get 또는 set로 시작하는 메소드 이름을 작성하고 각각 0 또는 하나의 매개 변수 (각각)를 가져 오면 재산의 주요 후보라는 것입니다.

물체의 실제 속성을 설정하는 경우 속성을 사용합니다.

작업 / 기능을 수행하는 경우 메소드를 사용합니다.

당신의 예에서, 그것은 명확한 속성이 설정되고 있습니다.

그러나 기능이 맹렬한 기능이라면 메소드를 사용하는 것입니다.

속성은 객체에서 데이터를 주입하거나 검색하는 방법입니다. 클래스 내에서 변수 또는 데이터에 대한 추상화를 만듭니다. 그들은 Java의 getters and setters와 유사합니다.

방법은 작업을 캡슐화합니다.

일반적으로 저는 속성을 사용하여 단일 비트의 데이터를 노출 시키거나 판매 세와 같은 클래스에서 작은 계산을 노출시킵니다. 쇼핑 카트의 품목 수와 비용에서 파생됩니다.

데이터베이스에서 데이터를 검색하는 것과 같은 작업을 만들 때 메소드를 사용합니다. 움직이는 부품이있는 모든 작업은 방법의 후보입니다.

코드 예제에서 나는 클래스를 포함하는 외부에 액세스 해야하는 경우 속성에 랩핑합니다.

public Label Title 
{
   get{ return titleLabel;}
   set{ titleLabel = value;}
}

텍스트 설정 :

Title.Text = "Properties vs Methods";

내가 레이블의 텍스트 속성 만 설정한다면 이것이 내가하는 방법입니다.

public string Title 
{
   get{ return titleLabel.Text;}
   set{ titleLabel.Text = value;}
}

텍스트 설정 :

Title = "Properties vs Methods";

MSDN을 검색하면서 참조를 찾았습니다 속성 대 방법 방법을 만들기위한 훌륭한 지침을 제공합니다.

  • 작업은 다음과 같은 변환입니다 Object.ToString.
  • 작업은 사용자에게 결과를 캐싱하는 것을 고려해야 할 정도로 비용이 많이 듭니다.
  • Get Accessor를 사용하여 속성 값을 얻는 것은 관찰 가능한 부작용이 있습니다.
  • 연속으로 회원을 두 번 호출하면 결과가 다릅니다.
  • 실행 순서가 중요합니다. 유형의 속성을 순서로 설정하고 검색 할 수 있어야합니다.
  • 멤버는 정적이지만 변경할 수있는 값을 반환합니다.
  • 멤버는 배열을 반환합니다. 반환 배열의 속성은 매우 오해의 소지가있을 수 있습니다. 일반적으로 사용자가 내부 상태를 변경할 수 없도록 내부 배열 사본을 반환해야합니다. 이는 사용자가 쉽게 인덱스 된 속성이라고 가정 할 수 있다는 사실과 함께 비효율적 인 코드로 이어집니다.

대체 특성은 객체의 속성입니다. 방법은 대상의 동작입니다.

레이블은 속성이며 속성을 만드는 것이 더 합리적입니다.

객체 지향 프로그래밍 측면에서 행동의 일부가 무엇인지, 단지 속성이 무엇인지 명확하게 이해해야합니다.

자동차 {색상, 모델, 브랜드}

자동차에는 색상, 모델 및 브랜드 속성이 있으므로 대체로 차가 자신의 색상을 설정하도록 요청하지 않기 때문에 메소드 SetColor 또는 SetModel을 갖는 것은 의미가 없습니다.

따라서 속성/방법 케이스를 실제 객체에 매핑하거나 상징적 인 관점에서 보면 혼란이 사라질 것입니다.

당신은 바로 이름 만 볼 필요가 있습니다 ... "속성". 무슨 뜻인가요? 사전은 여러 가지 방법으로이를 정의하지만이 경우 "사물의 필수 또는 독특한 속성 또는 품질"이 가장 잘 맞습니다.

행동의 목적에 대해 생각하십시오. 사실, "필수 또는 독특한 속성"을 변경하거나 검색하고 있습니까? 예에서는 함수를 사용하여 텍스트 상자의 속성을 설정합니다. 어리석은 것 같아요?

속성은 실제로 기능입니다. 그들은 모두 getxxx () 및 setxxx ()로 컴파일합니다. 그것은 단지 구문 설탕에 숨어 있지만, 그것은 과정에 의미 적 의미를 제공하는 설탕입니다.

속성과 같은 속성에 대해 생각하십시오. 자동차에는 많은 속성이 있습니다. 색상, mpg, 모델 등 .. 모든 속성을 설정할 수있는 것은 아니며 일부는 계산할 수 있습니다.

한편, 방법은 행동입니다. GetColor는 재산이어야합니다. getFile ()는 함수 여야합니다. 다른 경험의 규칙은 객체의 상태를 변경하지 않으면 함수 여야한다는 것입니다. 예를 들어, CalculatePitonthDigit (n)은 실제로 첨부 된 수학 객체의 상태를 변경하지 않기 때문에 기능이어야합니다.

이것은 아마도 약간 멍청하지만, 그것은 당신의 객체가 무엇인지, 그리고 그들이 나타내는 것을 결정하는 데 실제로 요약됩니다. 속성이나 기능이어야하는지 알 수 없다면 어느 쪽이 중요하지 않을 수도 있습니다.

추가/세트 방법에 속성을 사용하는 것이 좋습니다. 1 매개 변수. 매개 변수가 많으면 방법을 사용하십시오.

속성은 단순한 세트 만 있어야하며 하나의 라이너를 가져와야합니다. 무엇이든 실제로 방법으로 이동해야합니다. 복잡한 코드는 항상 방법에 있어야합니다.

가변 액세스, 즉 개별 변수를 얻고 설정하거나 컨트롤에서 데이터를 얻고 설정하는 데만 속성을 사용합니다. 모든 종류의 데이터 조작이 필요하거나 수행 되 자마자 방법을 사용합니다.

또한 속성에 대한 큰 장점은 디버깅 중에 Visual Studio에서 속성 값을 볼 수 있다는 것입니다.

속성은 비주얼 스튜디오의 비주얼 디자이너에서 액세스 할 수 있기 때문에 정말 좋습니다.

그들은 당신이 단순히 설정하고 얻는 것만으로도 사용되며 아마도 상당한 양의 코드에 액세스하지 않는 일부 검증. 검증 중에 복잡한 개체를 만드는 것은 간단하지 않기 때문에주의하십시오.

다른 방법은 선호하는 방법입니다.

의미론에 관한 것이 아닙니다. 비주얼 스튜디오 비주얼 디자이너에서는 이상한 속성을 사용하여 이상하게 시작됩니다.

예를 들어 클래스 속성 내에서 구성 값을 얻었습니다. 구성 클래스는 실제로 파일을 열고 SQL 쿼리를 실행하여 해당 구성의 값을 얻습니다. 이로 인해 내 응용 프로그램에서 구성 파일이 내 응용 프로그램이 아닌 Visual Studio 자체를 통해 구성 파일이 열리고 잠겨있는 문제가 발생했을뿐만 아니라 구성 값 (세터 메서드를 통해)을 작성했기 때문에 내 응용 프로그램이 아닌 Visual Studio 자체가 잠겨 있습니다. 이것을 해결하기 위해서는 방법으로 변경해야했습니다.

설계 속성의 문제로 클래스 객체의 데이터 또는 속성을 나타내는 반면 방법은 클래스 객체의 동작 또는 동작입니다.

.NET에서는 세계에서 속성 사용의 다른 의미가 있습니다.

  • 속성은 데이터베이닝에 사용되며 Get_ / Set_ 메소드는 그렇지 않습니다.
  • XML 직렬화 사용자 특성은 자연적인 직렬화 메커니즘입니다.
  • 속성은 액세스합니다 PropertyGrid 통제와 인턴 iCustomtypedescriptor, 사용자 정의 라이브러리를 작성하는 경우 효과적으로 사용할 수 있습니다.
  • 속성은 제어합니다 속성, 현명하게 사용하여 측면 지향적 인 소프트웨어를 설계 할 수 있습니다.

속성 사용에 대한 오해 (IMHO) :

  • 작은 계산을 노출시키는 데 사용 : controldesigner.selectionRulesget 블록은 72 줄로 실행됩니다 !!
  • 내부 데이터 구조를 노출시키는 데 사용됩니다. 속성이 내부 데이터 구성원에 매핑되지 않더라도 클래스의 속성 인 경우 속성으로 사용할 수 있습니다. 그 반대로, 클래스 속성의 속성이 권장되지 않더라도 데이터 멤버와 같은 배열을 반환하는 데 도움이됩니다 (대신 메소드는 멤버의 깊은 사본을 반환하는 데 사용됩니다.)

여기에있는 예에서는 더 많은 비즈니스 의미와 함께 작성 될 수 있습니다.

public String Title
{
    set { Label.Text = text; }
}

여기에 좋은 세트가 있습니다 가이드 라인 속성 대 메소드를 사용하는시기 빌 바그너

  • 이 모든 것이 사실 일 때 속성을 사용하십시오. getters는 간단해야하므로 예외를 제외하지 않을 것입니다. 이는 네트워크 (또는 데이터베이스) 액세스가 없음을 의미합니다. 어느 쪽이든 실패 할 수 있으므로 예외가 발생합니다.
  • 그들은 서로에 대한 의존성이 없어야합니다. 여기에는 한 속성을 설정하고 다른 속성에 영향을 미치는 것이 포함됩니다. (예를 들어, FirstName 속성을 설정하면 이름 + 성 속성을 구성한 읽기 전용 풀 이름 속성에 영향을 미칩니다.
  • 그들은 어떤 순서로든 해결해야합니다
  • Getter는 관찰 가능한 부작용을 가지고 있지 않습니다.이 가이드 라인은 속성에서 어떤 형태의 게으른 평가를 배제하지 않습니다.
  • 메소드는 항상 즉시 반환해야합니다. (이것은 데이터베이스에 액세스 할 수있는 속성을 배제하여 데이터베이스 호출, 웹 서비스 호출 또는 기타 유사한 작업을 배제합니다).
  • 멤버가 배열을 반환하는 경우 메소드를 사용하십시오.
  • Getter에 대한 반복 통화 (개입 코드없이)는 동일한 값을 반환해야합니다.
  • 세터에 대한 반복 호출 (동일한 값)은 단일 통화와 차이가 없어야합니다.

  • GET는 내부 데이터 구조에 대한 참조를 반환해서는 안됩니다 (항목 23 참조). 방법은 딥 카피를 반환 할 수 있으며이 문제를 피할 수 있습니다.

*중복 질문에 대한 내 대답에서 가져 왔습니다.

이것은 간단합니다.

1: 현장에 저장하기 전에 데이터를 검증해야 할 때 속성을 사용하십시오. 따라서 이러한 방식으로 속성은 필드에 대한 캡슐화를 제공합니다. 필드를 떠나는 경우 공개 최종 사용자는 나이와 같은 비즈니스 요구 사항에 따라 유효 할 수있는 값을 할당 할 수 있습니다. 나이와 같은 연령은 18보다 클 수 있습니다. 따라서 값이 상점 해당 필드가되기 전에 유효성을 확인해야합니다. 이러한 방식으로 속성은 데이터를 나타냅니다.

2: 사용 방법을 사용하려면 매개 변수로 일부 데이터를 제공하는 것과 같은 일부 작업을 수행하고 있으며 방법은 제공된 값과 처리 된 처리 된 값을 기준으로 일부 처리를 수행하고 있습니다. 또는이 계산으로 일부 필드의 값을 변경하려고합니다. "이러한 방식으로 방법은 동작을 나타냅니다."

나는 내가 사용한 Java에서왔다 .. 세트 .. 한동안 방법.

코드를 작성할 때, 나는 내 자신에게 묻지 않습니다. "이 데이터에 액세스하는 것은 간단하거나 무거운 과정이 필요합니까?" 상황이 바뀔 수 있기 때문입니다 (오늘이 속성을 검색하는 것은 간단합니다. Tomonrow는 약간 또는 무거운 과정이 필요할 수 있습니다).

오늘 저는 방법 설정 (int Age) Tomonrow가 있습니다. 출생지를 사용하여 나이를 계산하는 메소드 설정 (날짜 생년월일)도 있습니다.

컴파일러가 Get and Set에서 속성을 변환 한 것에 매우 실망했지만 내 get ... 그리고 세트를 고려하지 않습니다. 방법을 동일합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top