2011-09-29 6 views
0

_Parameters라는 해시 테이블에 대한 getter 함수가있는 클래스가 있습니다.이 해시 테이블을 읽기 전용으로 설정하면 안됩니까?

private Hashtable _Parameters = new Hashtable(); 
public Hashtable Parameters { get { return _Parameters; } } 

_Parameters는 코드의 다른 곳에서 참조되지 않습니다. 이제 setter 함수가 없으므로이 클래스 외부의 어떤 것도 _Parameters가 저장 한 것을 수정할 수 없다고 생각합니다. 단지 읽어야 만합니다. 그러나 그것은 사실이 아닙니다. 다른 클래스는이 코드를 호출합니다 (템플릿은 위에서 언급 한 클래스의 인스턴스입니다).

template.Parameters[key] = parameters[key]; 

이렇게하면 _Parameters가 수정됩니다. 이것이 어떻게 가능한지? setter 함수는 vales에 '='를 할당 할 때만 적용됩니까?

답변

5

아니요. 수정할 수있는 참조가 반환됩니다. 그러나 참조 자체를 재정의 할 수는 없습니다.

대신 ReadOnlyDictionary<TKey, TValue>을 사용해보십시오.

또한 Immutable Objects을 읽어 보시기 바랍니다. 그것은 당신에게 주제를 설명해야합니다.

+0

의미가 있습니다. 감사합니다. 해시 테이블을 ReadOnlyDictionary로 변경할 수는 있지만 내 코드는 아닙니다.나는 단지 그것을 더 잘 이해하려고 노력하고있다. :) – CountMurphy

+1

@Claus : 설명 만하면된다. 수정 될 수있는 참조를 반환하고있다. 그러나 참조 자체를 재정의 할 수는 없습니다. *. 좀 더 정확히 말하자면, 객체 인스턴스에 대한 참조를 리턴하고 외부에서 참조 변수의 * 사본 *을 보게되므로 내부 변수가 참조하는 객체를 변경할 수 없습니다. –

2

Hashtable의 메서드에 액세스 할 수 있습니다. 새 값 (예 : NULL 또는 새 Hashtable 인스턴스)으로 설정할 수 없습니다.

예를 들어 getter가 있지만 setter가없는 List와 List가있는 경우 목록에서 제거하고 목록에서 제거하고 Clear() 메서드를 호출하여 목록을 비울 수 있습니다. 하지만 setter가 없기 때문에 myList = null (또는 myList = new List())를 수행 할 수 없습니다.

개체에 대한 참조를 얻는 중입니다. 개체를 조작 할 수는 있지만 설정자가 없으면 새 개체에 대한 참조를 설정할 수 없습니다.

1

_Parameters을 반환하면 새로운 Hashtable을 반환하지 않습니다. 같은 참조를 다른 참조로 반환합니다. 이 객체는 동일한 객체에 대한 참조이므로 해당 객체를 수정하는 것을 포함하여 Hashtable의 전체 인터페이스를 사용할 수 있습니다. 세터가 부족하면 이전의 _Parameters을 새로운 것으로 교체 할 수 없습니다. Hashtable

3

HashTable 개체를 변경하거나 HashTable의 콘텐츠를 변경하는 경우에는 차이가 있습니다.

세터의 부족

확실히 아무도 할 수 있습니다 :
  • 변화 다른 해시의 해시의 참조를 NULL로 해시 테이블을 설정합니다.

그러나 HashTable의 내용은 변경할 수 있습니다.

1

클래스 개체 (구조체와 반대)에 대한 읽기 전용 속성을 사용하면 속성 값 (이 경우 개체 참조)을 수정할 수 없습니다. 그러나이 속성에 액세스하면 내부 HashTable 객체에 대한 참조를 가져오고 HashTable에서 항목을 추가 및 제거하는 등 반환 된 HashTable 객체에 대한 공용 메서드를 자유롭게 호출 할 수 있습니다. 읽기 전용 속성은 호출자가 HashTable 객체를 completley 다른 HashTable 객체로 바꾸는 것을 방지합니다.

관련 문제