C # die Sprache ist nicht, aber .NET das Framework kann sein.
Die Vertragsbibliothek + die in .NET 4 eingeführten statischen Analysetools können Folgendes einführen:
Microsoft verwendet derzeit [Unveränderlich] und [Rein] in .NET 3.5 Framework.
Siehe beispielsweise [Microsoft.Contracts.Immutable] und [Microsoft.Contracts.Pure] in .NET 3.5 in der System.Core.dll. Leider sind sie intern. Microsoft.Contracts. * Entsteht jedoch hauptsächlich aus der Forschung zu Spec #, und Spec # wurde in die Vertrags-APIs integriert, die Teil von .NET 4.0 sein werden.
Wir werden sehen, was daraus wird. Ich habe nicht überprüft, ob die .NET 4.0-Bits vor der Veröffentlichung APIs wie [Pure] oder [Immutable] in den Vertrags-APIs enthalten. In diesem Fall würde ich mir vorstellen, dass das statische Analysetool die Regel erzwingt und nicht der Compiler.
Bearbeiten Ich habe gerade Microsoft.Contracts.dll aus dem letzten Pre-Release-Drop von MS Code Contracts diese Woche geladen . Gute Nachrichten: Die Attribute [Pure] und [Mutability (Mutability.Immutable)] sind in der Bibliothek vorhanden, was darauf hindeutet, dass sie in .NET 4.0 enthalten sein werden. Woohoo!
edit 2 Nachdem .NET 4 veröffentlicht wurde, habe ich diese Typen nachgeschlagen. [Pure] ist noch im System.Diagnostics.Contracts-Namespace vorhanden. Es ist nicht für den allgemeinen Gebrauch gedacht, sondern für die Verwendung mit der Überprüfung der Vertrags-API vor und nach dem Zustand. Es wird weder vom Compiler erzwungen, noch wird das Code Contract Checker-Tool die Reinheit erzwingen . [Veränderlichkeit] ist weg. Interessanterweise hat .NET 4 BigInteger in System.Numerics verschoben und die Attribute [Pure] und [Mutability] entfernt, wenn Microsoft in .NET 3.5 (in der internen BigInteger-Klasse in System.Core.dll) die Attribute Mutability und Pure verwendet hat. Attribute von diesem Typ. Fazit: Es scheint, dass .NET 4 nichts für die Überprüfung von Nebenwirkungen tut.
edit 3 Mit den kürzlich (Ende 2011) vorgestellten Microsoft Rosyln-Compiler-as-a-Service-Tools, von denen angenommen wird, dass sie für RTM in Visual Studio 2015 geplant sind, sehen sie so aus, als könnten sie solche Dinge unterstützen. Sie können Erweiterungen in den Compiler schreiben, um die Reinheit und Unveränderlichkeit zu überprüfen, und Compiler-Warnungen ausgeben, wenn etwas, das mit diesen Attributen dekoriert ist, nicht den Regeln entspricht. Trotzdem schauen wir uns ein paar Jahre Zeit, um dies zu unterstützen.
edit 4 Jetzt, da Rosyln ab Sommer 2015 hier ist, besteht tatsächlich die Möglichkeit, eine Compiler-Erweiterung für Reinheit / Unveränderlichkeit zu erstellen. Dies hat jedoch nichts mit vorhandenem Framework-Code oder Bibliothekscode von Drittanbietern zu tun. Am Horizont steht jedoch ein C # 7-Vorschlag für unveränderliche Typen . Dies würde vom Compiler erzwungen und ein neues unveränderliches Schlüsselwort für C # und ein [unveränderliches] Attribut im .NET Framework einführen . Verwendung:
public immutable class Person
{
public Person(string firstName, string lastName, DateTimeOffset birthDay)
{
FirstName = firstName;
LastName = lastName;
BirthDay = birthDay;
}
public string FirstName { get; }
public string LastName { get; }
public DateTime BirthDay { get; }
}
edit 5 Es ist November 2016 und es scheint, dass unveränderliche Typen von C # 7 gestrichen wurden. Es gibt immer Hoffnung für C # 8 .:-)
edit 6 Es ist November 2017. C # 8 wird vollständig angezeigt , und obwohl wir keine reinen Funktionen haben, werden wir schreibgeschützte Strukturen haben . Dies macht eine Struktur unveränderlich, was mehrere Compileroptimierungen ermöglicht.
edit 7 Es ist Juli 2020 und C # 9 unterstützt Datensätze , bei denen es sich um vollständig unveränderliche Typen handelt. Darüber hinaus verfügen Datensätze über With-Ausdrücke zum Erstellen neuer Datensätze aus vorhandenen Datensätzen, um den neuen Status darzustellen.