2011-08-16 17 views
5

Próbuję napisać krótki fragment, aby pokazać różnicę między typem niezmiennym a zmiennym. Czy ten kod wydaje się odpowiedni dla wszystkich?Niezmienny vs Mutable C#

class MutableTypeExample 
{ 
    private string _test; //members are not readonly 
    public string Test 
    { 
     get { return _test; } 
     set { _test = value; } //class is mutable because it can be modified after being created 
    } 

    public MutableTypeExample(string test) 
    { 
     _test = test; 
    } 

    public void MakeTestFoo() 
    { 
     this.Test = "FOO!"; 
    } 
} 

class ImmutableTypeExample 
{ 
    private readonly string _test; //all members are readonly 
    public string Test 
    { 
     get { return _test; } //no set allowed 
    } 

    public ImmutableTypeExample(string test) //immutable means you can only set members in the consutrctor. Once the object is instantiated it cannot be altered 
    { 
     _test = test; 
    } 

    public ImmutableTypeExample MakeTestFoo() 
    { 
     //this.Test = "FOO!"; //not allowed because it is readonly 
     return new ImmutableTypeExample("FOO!"); 
    } 
} 
+0

To nie jest klasa, która jest zmienna, ale pole. Możesz mieszać pola 'readonly' i 'normal' w klasie, o ile pola' readonly' są przypisywane tylko w kodzie konstruktora lub w czasie inicjalizacji. – Matten

+0

'ImmutableTypeExample MakeTestFoo()' nie ma większego sensu. Czy ma być statyczny? –

Odpowiedz

14

Tak, to wygląda na rozsądne.

Mimo to, chciałbym również mówić o "nieszczelności" zmienność. Na przykład:

public class AppearsImmutableButIsntDeeplyImmutable 
{ 
    private readonly StringBuilder builder = new StringBuilder(); 
    public StringBuilder Builder { get { return builder; } } 
} 

nie mogę zmienić który budowniczy instancją pojawia się, ale mogę zrobić:

value.Builder.Append("hello"); 

Byłoby warto czytasz Eric Lippert w blogu na kinds of immutability - i w rzeczywistości wszystkie pozostałe posty z serii.

+0

Innymi słowy, przykład działa tylko dlatego, że właściwość łańcuchowa, której używa, również jest niezmienna. Jak tylko masz zmienną właściwość, nawet jeśli jest dostępna tylko przez getter, nie jesteś w pełni niezmienny. –

+0

Możesz również wnioskować o kolekcjach, niezmiennych/zmiennych parach klas itp. Napisałem o tym artykuł, który powinien być interesujący w tym kontekście: http://rickyhelgesson.wordpress.com/2012/07/17/mutable-or- niezmienny-w-równoległym-świecie/ –

4

Tak, to wygląda prawidłowo.

Należy pamiętać, że członkowie prywatni nie muszą być w trybie "tylko do odczytu", aby klasa była niezmienna, to tylko dodatkowe zabezpieczenie przed złamaniem kodu wewnątrz klasy.

+0

Dzięki za cynk – Hoody