Was ist der Unterschied zwischen C # und CLI bei Werttypen und Konstruktoren?

8

Ich habe kürzlich gelesen, dass die C # - und CLI-Standards unterschiedliche Möglichkeiten zur Handhabung von Werttypen und Konstruktoren definieren.

Gemäß der CLI-Spezifikation dürfen Werttypen keine parameterlosen Konstruktoren haben, wohingegen in der C # -Spezifikation Werttypen einen parameterlosen Standardkonstruktor haben. Wenn Sie gemäß der CLI-Spezifikation einen Wert ohne Angabe von Parametern erstellen müssen, gibt es dafür eine spezielle Anweisung.

Also meine Fragen sind

  • Warum würden die C # -Konstrukteure absichtlich vom CLI-Standard abweichen? Welchen Nutzen hatten sie und warum erlaubte das CLI diese Funktionalität nicht?
  • In meiner begrenzten Erfahrung benutze ich jedes Mal, wenn ich eine "spezielle Anweisung" verwende, um Funktionen zu ermöglichen, die ursprünglich nicht beabsichtigt waren, es ist normalerweise ein bisschen ein Hack. Wie ist das anders?
DaveDev 05.08.2010, 09:31
quelle

3 Antworten

7

An verschiedenen Stellen macht es Sinn, aus der Sicht Konsistenz zu denken, dass Wertetypen einen parameterlosen Konstruktor haben. Sie können immer einen Wert ohne Angabe von Argumenten erstellen, und zwar sowohl in der CLI als auch in C #. In C # können Sie einfach die Standardkonstruktorsyntax verwenden:

%Vor%

statt dass es eine Syntax dafür und eine andere Syntax zum Aufrufen eines "echten" Konstruktors gibt.

Beachten Sie, dass es ab C # 2 den Standardwertoperator gibt, bei dem stattdessen verwendet werden könnte:

%Vor%

Das fühlt sich näher an die generierte IL an, wirklich. Ich nehme an, es ist nur möglich, dass C #, wenn wir das gehabt hätten, nicht "vorgetäuscht" hätte, dass alle Werttypen parameterlose Konstruktoren haben.

Betrachten Sie andererseits Generika:

%Vor%

Sollte das für Werttypen erlaubt sein? Es ist - aber wenn C # new int() nicht zuließ, dann würde es nicht viel Sinn machen, es in einer generischen Form zuzulassen ...

Ein interessanter Punkt, den Sie vielleicht genauer betrachten möchten - obwohl Sie in C # keinen parameterlosen Konstruktor für einen benutzerdefinierten Werttyp definieren können, können Sie dies in IL tun, und C # wird manchmal verwenden es (und manchmal nicht) abhängig vom Kontext. Weitere Informationen finden Sie in meinem Blogeintrag .

    
Jon Skeet 05.08.2010, 09:46
quelle
0
  

während Werttypen in der C # -Spezifikation einen parameterlosen Standardkonstruktor haben

Das können Sie nicht ändern. Also ist der Effekt der gleiche, nur anders definiert.

    
Richard 05.08.2010 09:41
quelle
0

Ein wichtiger Unterschied zwischen Werttypen und Klassentypen besteht darin, dass Instanzen vom Typ class im Gegensatz zu Instanzen vom Typ value nur durch Aufrufen eines Konstruktors erzeugt werden können und nicht der Außenwelt ausgesetzt werden, bis der Konstruktor fertiggestellt ist oder exponiert das Objekt im Aufbau explizit. Im Gegensatz dazu werden Instanzen vom Werttyp durch die Erzeugung einer umschließenden Struktur- oder Klassentypinstanz mit einem Werttyp-Feld oder durch die Erzeugung eines Arrays von Werttyp-Elementen erzeugt. Obwohl es keinen technischen Grund gäbe, warum Microsoft keine expliziten parameterlosen Konstruktoren für Strukturen definieren durfte, wäre es schwierig gewesen sicherzustellen, dass jeder parameterlose Konstruktor in jeder Struktur ausgeführt wird, bevor sie der Außenwelt ausgesetzt ist. und es wäre verwirrend gewesen, wenn ein solcher Konstruktor in einigen Situationen ausgeführt würde, aber nicht in anderen.

    
supercat 13.01.2012 21:29
quelle