2012-06-01 8 views
9

Warum haben die Designer von C# so etwas nicht zugelassen?Warum gibt es in C# keine deklarative Unveränderlichkeit?

public readonly class ImmutableThing 
{ 
    ... 
} 

Eine der wichtigsten Möglichkeiten, um sicheres Multi-Threading ist die Verwendung von unveränderlichen Objekten/Klassen, doch gibt es keine Möglichkeit, eine Klasse, die als unveränderlich zu erklären. Ich weiß, dass ich es durch eine korrekte Umsetzung unwandelbar machen kann, aber wenn dies durch eine Klassenerklärung durchgesetzt würde, würde es so viel einfacher und sicherer werden. Eine Klasse als unveränderlich zu bewerten, ist bestenfalls eine "Türsteher" -Lösung.

Ein Blick auf eine Klassendeklaration und Sie würden sofort wissen, dass es unveränderlich ist. Wenn Sie den Code einer anderen Person ändern müssten, würden Sie wissen, dass eine Klasse keine Änderungen durch Absicht zulässt. Ich kann hier nur Vorteile sehen, aber ich kann nicht glauben, dass niemand vorher darüber nachgedacht hat. Warum wird nicht unterstützt?

EDIT

Einige sagen, dass dies nicht sehr wichtiges Merkmal ist aber, dass mich nicht wirklich überzeugen. Multicore-Prozessoren zeigten sich, weil die zunehmende Leistung durch die Frequenz eine Wand traf. Supercomputer sind stark Multiprozessor-Maschinen. Die parallele Verarbeitung wird immer wichtiger und ist einer der wichtigsten Wege, um die Leistung zu verbessern. Die Unterstützung für Multithreading und parallele Verarbeitung in .NET ist von Bedeutung (verschiedene Lock-Typen, Thread-Pool, Tasks, Async-Aufrufe, gleichzeitige Collections, blockierende Sammlung, parallele foreach, PLINQ und so weiter) und es scheint mir alles, was Ihnen hilft parallel zu schreiben Code gibt leichter einen Vorteil. Auch wenn es nicht trivial ist, es zu implementieren.

+0

Weil es nicht ist. Wäre aber nett und würde Fenster auf der ganzen Linie öffnen, wenn sie die Sprache verbessern möchten. –

+1

Ist das nicht eine Struktur? (Eine Klasse wie Entity mit Wert Semantik) – FishBasketGordo

+4

@FishBasketGordo, nein. –

Antwort

12

Im Grunde, weil es kompliziert ist - und wie usr schrieb, benötigen Funktionen auf verschiedene Arten eine Menge Arbeit, bevor sie versandbereit sind. (Es ist einfach, ein Sessel Sprache Designer zu sein - ich bin sicher, es ist unglaublich schwer zu wirklich es tut, in einer Sprache, mit Millionen von Entwicklern mit kritischen Code-Basen, die nicht durch Änderungen durchbrochen werden kann.)

Es ist schwierig für einen Compiler, um zu überprüfen, ob ein Typ sichtbar unveränderbar ist, ohne in einigen Fällen übermäßig restriktiv zu sein. Als ein Beispiel ist String tatsächlich innerhalb von mscorlib änderbar, aber der Code anderer Typen (z. B. StringBuilder) wurde sehr sorgfältig geschrieben, um zu vermeiden, dass die Außenwelt jemals diese Veränderlichkeit sieht.

Eric Lippert hat written a lot on immutability - es ist ein komplexes Thema ist, das brauchen würde/einen viele Arbeit in eine praktische Sprache-Funktion einzuschalten. Es ist auch ziemlich schwer, auf eine Sprache und das Framework, die es nicht hatte, zu beginnen.Ich würde C# lieben, es zumindest einfacher zu schreiben, um unveränderliche Typen zu schreiben, und ich vermute, dass das Team eine ganze Weile darüber nachgedacht hat - ob sie jemals glücklich genug mit ihren Ideen sein werden, es in eine Produktionssprache zu verwandeln Feature ist eine andere Sache.

+0

Warum kann der unveränderliche Typ nicht einfach bedeuten, dass jedes Feld nur gelesen werden muss? Das scheint nicht zu kompliziert oder schwierig, nein? –

+3

@KirkWoll: Ein Typ mit einem schreibgeschützten 'StringBuilder'-Member ist nicht so unveränderlich, wie es die meisten Leute wollen. Grundsätzlich ist Mutabilität viral. –

+0

ah, ich verstehe. Ich dachte nicht, dass es tief durchgesetzt werden würde. –

5

Funktionen müssen entwickelt, implementiert, getestet, dokumentiert, bereitgestellt und unterstützt werden. Deshalb erhalten wir die wichtigsten Funktionen zuerst und die weniger wichtigen erst spät oder nie.

Ihr Vorschlag ist in Ordnung, aber es gibt eine einfache Problemumgehung (wie Sie gesagt haben). Daher ist es kein "dringendes" Feature.

Es gibt auch eine Sache namens darstellende Unveränderlichkeit wo Zustand Mutationen innerhalb des Objekts sind erlaubt, aber nie nach außen sichtbar gemacht werden. Beispiel: ein träge berechnetes Feld. Dies wäre unter Ihrem Vorschlag nicht möglich, da der Compiler die Klasse niemals als unveränderbar nach außen beweisen könnte, obwohl in ihr Feld routinemäßig geschrieben wird.

+1

Nicht zu erwähnen, dass das Problem viel schwieriger ist, als es scheint, und härtere Probleme werden eher zugunsten leichterer Probleme zurückgestuft. –

+0

@MystereMan: Ich würde das nicht unbedingt sagen. Es gibt viele kleine, tief hängenden Früchte, die das C# -Team * anstelle von async übernommen haben könnte - was alles andere als ein "einfaches" Problem ist. –

+0

@JonSkeet - Deshalb habe ich "Tend to" gesagt. Es gibt natürlich Ausnahmen, wenn ein Problem a) Teil des Marketingplans einer großen Anzahl von Produkten und b) wirklich cool ist;) –