Ich lerne etwas über Codeverträge in .NET und versuche, die Idee reiner Konstruktoren zu verstehen. Der Code Verträge Dokumentation lautet:
Alle Methoden, die in einem Vertrag aufgerufen werden, müssen rein sein. Das heißt, sie dürfen keinen bereits vorhandenen Status aktualisieren. Eine reine Methode darf Objekte ändern, die nach dem Eintritt in die reine Methode erstellt wurden.
Und die PureAttribute
Dokumentation besagt:
Gibt an, dass ein Typ oder eine Methode rein ist, dh, dass keine sichtbaren Statusänderungen vorgenommen werden.
Ich verstehe diese Aussagen, wenn es um Methoden geht, aber was ist mit Konstruktoren? Angenommen, Sie hatten eine Klasse wie diese:
public class Foo
{
public int Value { get; set; }
public Foo(int value) {
this.Value = value;
}
}
Dieser Konstruktor wirkt sich offensichtlich auf den Zustand des neuen Foo
Objekts aus, hat jedoch keine weiteren Nebenwirkungen (z. B. er manipuliert keinen der Parameter oder ruft keine nicht-reinen Methoden auf). Ist das ein Kandidat für [Pure]
oder nicht? Welche Bedeutung hat das Platzieren eines [Pure]
Attributs in einem Konstruktor, und wann sollte ich dies in meinem eigenen Code tun?
[Pure]
Attribut zu schreiben und sie an einer anderen Stelle in einem Vertrag zu verwenden, um eine endgültige Antwort zu erhalten.Das Objekt kann erst verwendet werden, wenn es in diesem Fall erstellt wurde. Daher ist der Konstruktor rein. Wenn der Konstruktor einen anderen Code aufruft oder einen Delegaten aufruft und der andere Code die veränderbare Eigenschaft ändert, ist sie nicht rein. Um sicherer zu sein, ist es besser, die Immobilie unveränderlich zu machen.
quelle