Uczę się o kontraktach kodowych w .NET i staram się zrozumieć ideę czystych konstruktorów. Dokumentacja kontraktów kodowych stanowi:
Wszystkie metody wywoływane w ramach umowy muszą być czyste; oznacza to, że nie mogą aktualizować żadnego istniejącego stanu. Metoda czysta może modyfikować obiekty utworzone po wejściu do metody czystej.
A PureAttribute
dokumentacja stwierdza:
Wskazuje, że typ lub metoda jest czysta, to znaczy nie wprowadza żadnych widocznych zmian stanu.
Rozumiem te stwierdzenia, jeśli chodzi o metody, ale co z konstruktorami? Załóżmy, że miałeś taką klasę:
public class Foo
{
public int Value { get; set; }
public Foo(int value) {
this.Value = value;
}
}
Ten konstruktor oczywiście wpływa na stan nowego Foo
obiektu, ale nie ma innych skutków ubocznych (np. Nie manipuluje żadnym parametrem ani nie wywołuje metod nieczystych). Czy to kandydat na [Pure]
czy nie? Jakie znaczenie ma umieszczenie [Pure]
atrybutu na konstruktorze i kiedy powinienem to zrobić we własnym kodzie?
[Pure]
atrybutu, i użyć go gdzieś w kontrakcie, aby uzyskać ostateczną odpowiedź.Nie można użyć obiektu, dopóki nie zostanie skonstruowany w tym przypadku. Dlatego konstruktor jest czysty. Gdyby konstruktor wywołał inny kod lub wywołał delegata, a inny kod zmodyfikowałby zmienną właściwość, nie byłoby to czyste. Aby być bezpieczniejszym, lepiej jest uczynić nieruchomość niezmienną.
źródło