programing

C # 속성은 실제로 메서드입니까?

nasanasas 2020. 10. 14. 07:54
반응형

C # 속성은 실제로 메서드입니까?


지금까지 나는 Properties& Methods가 C #에서 서로 다른 두 가지 라는 인상을 받았습니다 . 하지만 다음과 같이했습니다.

여기에 이미지 설명 입력

그리고 이것은 나에게 "눈 오프너"였습니다. 나는 하나의 속성 stringProp과 하나의 방법 을 기대 stringProp했지만 대신 이것을 얻었습니다.

왜 이런 일이 발생 했습니까? 누군가 설명해 주시겠습니까?


예, 컴파일러는 속성에 대한 get 및 set 메서드 쌍과 자동 구현 속성에 대한 개인 지원 필드를 생성합니다.

public int Age {get; set;}

다음과 동일합니다.

private int <Age>k__BackingField;

public int get_Age()
{
     return <Age>k__BackingField;
}

public void set_Age(int age)
{
    <Age>k__BackingField = age;
}

속성에 액세스하는 코드는이 두 메서드 중 하나를 호출하도록 컴파일됩니다. 이것이 바로 공개 필드를 공개 자산으로 변경하는 것이 획기적인 변경 인 이유 중 하나입니다.

Jon Skeet의 Why Properties Matter를 참조하십시오 .


엄밀히가 있지만, 속성, 메소드하지, 말하기 되어 참으로 getter 및 setter 메소드 (또한 접근)에 의해 지원. 이와 같은 코드를 작성할 때 (아래에 언급 된 컴파일 오류를 제거하기 위해 코드를 수정 한 경우)

myFoo.stringProp = "bar";

컴파일러는 실제로 다음과 같은 IL 코드를 생성합니다.

ldstr       "bar"
callvirt    foo.set_stringProp

set_stringProp해당 속성에 대한 setter 메서드는 어디에 있습니까 ? 실제로 원하는 경우 리플렉션을 통해 이러한 메서드를 직접 호출 할 수 있습니다.

그러나 게시 한 코드 샘플은 Visual Studio의 intellisense에서 괜찮아 보일 수 있지만 컴파일되지는 않습니다. 프로젝트를 빌드하면 다음과 같은 오류가 표시됩니다.

'foo'유형에는 이미 'stringProp'에 대한 정의가 포함되어 있습니다.


이것은 비주얼 스튜디오의 지능 문제이며 이름으로 선택 됩니다 . 그건 그렇고 같은 유형의 이름 충돌로 인해 코드가 컴파일되지 않습니다.

그러나 속성 결국 메서드 라는 것이 맞습니다 .

public class A {

   public string Name  {get;set;}  
}

여기서 Name속성은 두 가지 방법으로 변환됩니다 : get_Name()set_Name().

실제로 다음과 같이 클래스를 정의하면 :

public class A {

   public string Name  {get;set;}  

   public string get_Name() {
       return "aaa"; 
   }
}

이미 정의되어 있으므로 컴파일 오류가 발생합니다 get_Name(속성).


예. 속성은 mutator메서드입니다.

컴퓨터 과학에서 mutator 방법은 변수의 변경을 제어하는 ​​데 사용되는 방법입니다. 세터 메서드라고도 널리 알려져 있습니다. 종종 setter는 개인 멤버 변수의 값을 반환하는 getter (접근 자라고도 함)와 함께 제공됩니다.

The mutator method is most often used in object-oriented programming, in keeping with the principle of encapsulation. According to this principle, member variables of a class are made private to hide and protect them from other code, and can only be modified by a public member function (the mutator method), which takes the desired new value as a parameter, optionally validates it, and modifies the private member variable.

Mutator methods may also be used in non-object-oriented environments. In this case, a reference to the variable to be modified is passed to the mutator, along with the new value. In this scenario, the compiler cannot restrict code from bypassing the mutator method and changing the variable directly. The onus falls to the developers to ensure the variable is only modified through the mutator method and not modified directly.

이를 지원하는 프로그래밍 언어에서 속성은 캡슐화의 유틸리티를 포기하지 않고 편리한 대안을 제공합니다.

참조 : http://en.wikipedia.org/wiki/Mutator_method

참고 URL : https://stackoverflow.com/questions/23102639/are-c-sharp-properties-actually-methods

반응형