2013-09-01 4 views
2

저는 C++에서 왔고 C#에서는 "const"를 그리워합니다.C#에서 참조를 통한 읽기 전용 필드 수정

내 코드에서 심한 버그를 추적 한이 사항을 고려하십시오

class MyClass { 
    BitArray myFlags { get; private set; } // this should not be able to be manipulated from outside 

    // ... constructor here creating the BitArray ... 
} 

// ... 

MyClass foo = new MyClass(); 

BitArray bar = foo.myFlags; 
bar.SetAll(false); // circumvents encapsulation eventually putting the class in inconsitent state 

사용자는 문제없이, 심지어 unintendedly 내 개체의 상태를 변경할 수 있습니다. 사용자에게 내 개체의 상태를 조작 할 기회를주지 않고 클래스 구성원을 안전하게 노출하려면 어떻게해야합니까? 이 멤버에게 공개 (읽기) 액세스를 제공 할 때 모든 단일 참조 기반 멤버 (기본적으로 모든 것)를 ".clone()"해야합니까?

내가 원하는 것은 적절한 캡슐화입니다. 사용자가 클래스의 인스턴스를 만들고 멤버를 읽을 때 멤버에게 공개 설정자가없는 경우 쓰기 방지를 원합니다.

+1

'readonly'는 필드가 가리키는 인스턴스에 영향을주지 않습니다. C#에는 언어 수준의 변경이 없습니다 (아직). – SLaks

+0

내 블로그도 참조하십시오. http://blog.slaks.net/2013-06-11/readonly-vs-immutable/ – SLaks

+0

'myFlags'를 비공개로 설정하고 일관성을 확인할 수있는 나만의 get/set 메서드를 작성하는 방법은 어떻습니까? ? – Corak

답변

0

C#은 불변의 컬렉션을위한 옵션으로 ReadOnlyCollection을 제공합니다.

희망이 있습니다.