2012-06-06 2 views
3

클래스를 고려C# 속성이 인스턴스 변수를 숨기거나 더 깊게 진행되고 있습니까? MSDN에 따르면</p> <pre><code>public class foo { public object newObject { get { return new object(); } } } </code></pre> <p>:

속성이 읽을 수있는 유연한 메커니즘, 쓰기를 제공하거나 개인 필드의 값을 계산 회원입니다. 속성은 공용 데이터 멤버 인 것처럼 처럼 사용할 수 있지만 실제로는 접근 자라고하는 메서드입니다. 이 데이터는 쉽게

그리고를 액세스 할 수 있도록 : 구현 또는 검증 코드를 숨기고

속성, 설정 값을 받고 의 공개 방법을 노출하는 클래스를 할 수 있습니다.

get 속성 접근자가 속성 값을 반환하는 데 사용되고 집합 접근자가 새 값을 할당하는 데 사용됩니다. 이 접근자는 다른 액세스 수준을 가질 수 있습니다. 자세한 내용은 액세서 접근성을 참조하십시오.

인덱서가 할당 한 값을 정의하는 데 value 키워드를 사용합니다.

set 메소드를 구현하지 않는 속성은 읽기 전용입니다. 을 사용하면서 동시에 안전성과 유연성을 제공합니다.

따라서 어떤 시점에서 newObject 속성 값에 반환 된 새 객체에 대한 참조가 있습니까? 또한

EDIT2 재산

에서 읽기 전용 제거

편집이이 속성에 대한 최적의 사용이 아니라 그 시도하고보다 효율적으로 문제를 설명하기 위해 수행 명확히하고 싶습니다.

+3

'readonly' 수정자는 속성 선언에 유효하지 않습니다. – Ani

답변

10

속성에 액세스 할 때마다 새 개체가 반환되며 이는 예상되는 속성 동작이 아닙니다. 대신 매번 동일한 값 (예 : 필드에 저장된 값)을 반환해야합니다. 속성 가져 오기 도구는 값을 반환하는 메서드에 대해 간단하게 구문을 바꾼 구문입니다. foo이하지 않는 새로운 객체를 생성합니다

public class foo 
{ 
    public object get_newObject() 
    { 
     return new object(); 
    } 
} 

는 getter를 호출 할 때마다 : 코드는 (컴파일러는 다음 IL로 방출되는 get_와 속성 이름을 접두어로하여 게터를 생성)이 같은 무언가로 컴파일 알고 있거나 액세스 할 수 있습니다.

따라서 어떤 시점에서 newObject 속성 값에 반환 된 새 객체에 대한 참조가 있습니까?

배면 필드를 사용


특성 :

class Foo { 

    readonly Object bar = new Object(); 

    public Object Bar { get { return this.bar; } } 

} 

자동 등록을 사용하여 :

class Foo { 

    public Foo() { 
    Bar = new Object(); 
    } 

    public Object Bar { get; private set; } 

} 

프로퍼티 공용 필드와 동일한 쉬운 구문을 사용하여 액세스된다. 그러나 속성을 사용하면 getter 및 setter에 코드를 추가 할 수 있으므로 getter에서 게으른로드 또는 setter에서 유효성 검사 (및 기타 사항)와 같은 작업을 수행 할 수 있습니다.

+0

읽어 주셔서 감사합니다. 나는 그것을 제거했습니다. 이것이 예상 된 동작은 아니지만 기본 아키텍처에 대해 궁금합니다. 이 값을 액세스 할 때마다 새로운 값을 얻을 수 있다고 생각하지만 클래스의 인스턴스가 반환되는 값에 대해 전혀 알지 못한다는 것을 의미합니까? –

+0

+1 어쩌면 속성이 C#의 언어 기능인 이유에 대해 약간의 사이트 노트를 추가 할 수 있습니다. (다른 언어에서는'float GetBla()'및'void SetBla (float value) '와 같은 tousands 메소드를 사용합니다. –

0

정확하게는 아닙니다. 속성은 구문 방식의 설탕이므로 액세스 메소드 (예 : Java)를 작성할 필요가 없습니다.

그래서이 :

private int _myInteger; 
public int MyInteger 
{ 
    get { return _myInteger; } 
    set { _myInteger = value; } 
} 

이에 equivilant입니다 :

private int _myInteger; 
public int GetMyInteger() 
{ 
    return _myInteger; 
} 

public void SetMyInteger(int value) 
{ 
    _myInteger = value; 
} 

을하고 또한 어떤이 더 좋아집니다는 equivilant :

public int MyInteger { get; set; } 
1

후드, 당신을 속성은 단순히 다음과 같은 get_newObject()라는 함수를 호출합니다.

public object get_newObject() 
{ 
    return new object(); 
} 

이 경우 항상 호출 할 때마다 새 개체가 반환됩니다.

당신이 개체에 대한 참조를 유지하고 싶은 경우에, 그래서 같은 데이터를 보유하는 개인 필드를 만들고 속성 액세스 해당 필드를 가지고 추천 할 것입니다 :

private object myObject; 
public object newObject 
{ 
    if(myObject == null) 
    { 
     myObject = new object(); 
    } 
    return myObject; 
} 

재산은 '아무튼 때문에 set을 정의 해, 필드는 비공개이므로, newObject는 기본적으로 포함하고있는 클래스의 외측에 있습니다.

1

C#의 속성은 "구문 설탕"입니다. get 속성 블록 내의 코드는 실제로 숨겨진 get_PropertyName() 메서드에 넣고 set 블록을 숨겨진 set_PropertyName() 메서드에 넣습니다. 코드의 경우, 다음과 같은 방법으로 생성됩니다 : 당신이 컴파일 된 어셈블리 사용 반사경, 또는 ILDASM을 볼 경우

public object get_newObject() 
{ 
    return new object(); 
} 

는 이러한 숨겨진 방법을 볼 수 있습니다.

속성을 사용할 때 C# 컴파일러는 속성의 "get"액세스를 get_newObject() 메서드 호출로 변환합니다. 예를 들어 :

var foo = new foo(); 
var aNewObject = foo.newObject; 

컴파일러가 그 변환과 같습니다 :

다음 작성한다면 다른 질문에 대답,

var foo = new foo(); 
var aNewObject = foo.get_newObject(); 

그래서, 새로 생성 된 객체 누군가가 속성을 foo 인스턴스 내에 저장하지 않을 때 반환되는 경우 호출자는 매번 새로운 객체를 가져옵니다.

관련 문제