Warum enthält C # Programmierkonstrukte, die nicht CLS-kompatibel sind?

8

Es ist seltsam, dass die Flaggschiffsprache von .NET Programmierkonstrukte enthält, die nicht CLS-konform sind. Warum ist das so?

Beispiel (aus hier ): Zwei oder mehr öffentliche / geschützte / geschützte interne Mitglieder, die nur mit Groß- und Kleinschreibung definiert wurden

%Vor%

oder

%Vor%     
richard 16.02.2011, 21:24
quelle

7 Antworten

16

Selbst vorzeichenlose Ganzzahlen sind nicht konform (zumindest auf der öffentlichen API), aber sie sind sehr wichtig für Leute, die Bit-Shifting betreiben, insbesondere wenn rechts-shifting (signed und unsigned haben unterschiedliche Rechts-Shift-Verhalten) .

Sie sind schließlich da, um Ihnen die Freiheit zu geben, sie zu verwenden wenn angemessen . Die Fallsensibilität, die ich weniger religiös finden konnte - trotz der Bequemlichkeit , dass ein Feld und eine Eigenschaft nur von Fall zu Fall verschieden sind, glaube ich, dass ich glücklich damit leben könnte, einen anderen Namen zu verwenden! Besonders jetzt haben wir automatisch Eigenschaften implementiert ...

Das ist ähnlich wie bei unsafe - der Unterschied liegt darin, dass ein paar vorzeichenlose Ganzzahlen nicht die gesamte Laufzeit destabilisieren, also brauchen sie nicht ganz so starke Molly-Wächter. p>

Sie können hinzufügen:

%Vor%

wenn Sie möchten, und der Compiler wird Ihnen sagen, wenn Sie es falsch verstehen.

Und schließlich: der meiste Code (nach Volumen) wird nicht als Komponente verbraucht. Es ist geschrieben, um einen Job zu machen, und möglicherweise von anderem Code intern verarbeitet. Es sind hauptsächlich Bibliotheksautoren / -anbieter, die sich um Dinge wie CLS-Compliance kümmern müssen. Das ist (nach den Zahlen) die Minderheit.

    
Marc Gravell 16.02.2011, 21:38
quelle
14

So funktioniert die CLS-Konformität nicht. Es ist etwas, das deine Last ist. C # beschränkt sich nicht auf die strikte Einhaltung selbst, die es zu einer Sprache mit geringer Expressivität machen würde. Das Ziehen aller .NET-Sprachen auf den kleinsten gemeinsamen Nenner hätte die Plattform schnell als brauchbare Programmierumgebung zunichte gemacht.

Es liegt an Ihnen sicherzustellen, dass die öffentlich sichtbaren Typen in Ihrer Assembly die CLS-Konformität erfüllen. Sicherzustellen, dass sich die Klassenmitglieder nicht nur von Fall zu Fall unterscheiden, ist sehr einfach. Lassen Sie den Compiler Ihnen helfen, indem Sie das [assembly: CLSCompliant (true)] - Attribut verwenden und der Compiler wird Sie warnen, wenn Sie ausrutschen.

    
Hans Passant 16.02.2011 21:41
quelle
4

Siehe Ссылка .

CLS ist eine Spezifikation, auf die man sich einlässt. Zitat von oben:

Wenn Sie Ihre eigenen CLS-kompatiblen Komponenten entwerfen, ist es hilfreich, ein CLS-kompatibles Tool zu verwenden. Das Schreiben von CLS-konformen Komponenten ohne diese Unterstützung ist schwieriger, weil Sie sonst möglicherweise nicht auf alle CLS-Funktionen zugreifen können, die Sie verwenden möchten.

Mit einigen CLS-kompatiblen Sprachcompilern, z. B. C # - oder Visual Basic-Compilern, können Sie angeben, dass Ihr Code CLS-kompatibel sein soll. Diese Compiler können die CLS-Konformität überprüfen und Sie darüber informieren, wenn Ihr Code Funktionen verwendet, die vom CLS nicht unterstützt werden. Mit den C # - und Visual Basic-Compilern können Sie ein Programmelement als CLS-kompatibel kennzeichnen, wodurch der Compiler einen Kompilierungsfehler generiert, wenn der Code nicht CLS-kompatibel ist. Der folgende Code generiert beispielsweise eine Compilerwarnung.

Beispielcode von oben link:

%Vor%

Dieser Code generiert die folgende C # Warnung:

Kopierwarnung CS3001: Argumenttyp 'uint' ist nicht CLS-konform

    
rskar 16.02.2011 21:42
quelle
3

Meine zwei Cent über CLS-Compliance

Die .net-Sprachen sind alle Entwicklungen von Sprachen, die zum Zeitpunkt ihrer Erstellung existierten. Die Sprachen wurden so entwickelt, dass Sie die Basisprojekte problemlos in .Net-Projekte konvertieren können, ohne dass zu viel Entwicklungsaufwand anfällt. Aufgrund der großen Unterschiede zwischen den Sprachen musste es eine Art Konvention für die Sprachen geben, um miteinander zu sprechen. Nehmen Sie die folgenden Sprachbeispiele:

VB.Net ist eine Sprache, die von der früheren Sprache VB6 abgeleitet ist. Es wird angenommen, dass es sehr ähnlich zu VB6 ist und daher viele Konventionen VB6 verwendet. Da VB6 von Nicht-Entwicklern leicht zu erlernen sein sollte, hat es gewisse Eigenschaften, die es idiotensicher machen. Dynamische Typisierung, Groß- / Kleinschreibung ist zwei dieser Dinge.

C # .Net / C ++. Net sind Abkömmlinge des Programmierer-freundlichen C ++. Da es sich um eine Weiterentwicklung dieser Sprache handelt, enthält C ++ das, was Sie tun können. Groß- / Kleinschreibung, statische Eingabe usw.

Nun, als sie mit zwei verschiedenen Sprachen konfrontiert wurden, die sie interoperabel machen wollten, machte Microsoft das einzig Vernünftige. Sie machten Beschränkungen, wie die zwei Sprachen miteinander interagieren können, indem sie im Grunde einen Softwarevertrag verwenden. Dieser Code kann nur aufgrund der Unterschiede in den Sprachen verwendet werden.

Nehmen Sie zum Beispiel den VB.Net-Code, der den C # -Code aufruft Wenn der C # -Code zwei Funktionen hatte, die sich nur im Fall unterscheiden, X () vs x (), würde VB.net nie in der Lage sein, diesen Code korrekt aufzurufen, da Groß- und Kleinschreibung nicht berücksichtigt wird. Die CLS-Compliance muss dies illegal machen. Wenn Sie sich die anderen Regeln ansehen, machen sie im Prinzip dasselbe für andere Sprachfunktionen zwischen den verschiedenen Sprachen.

    
apaq11 16.02.2011 22:08
quelle
2

Ich würde vermuten, dass die Groß- und Kleinschreibung nur in der CLS-Konformität enthalten war, damit VB.NET CLS-konform sein konnte. Soweit ich weiß, gibt es kein Problem, wenn ein bestimmtes Sprachkonstrukt nicht CLS-kompatibel ist, es sei denn, Sie verwenden es so, dass die inkompatiblen Elemente in der öffentlichen API Ihres Codes verfügbar sind.

Der Hinweis von Microsoft scheint zu sein, dass die CLS-Konformität nur in Code von Bedeutung ist, auf den Sie aus verschiedenen Sprachen zugreifen (z. B. durch Referenzieren einer C # -Assembly aus einem VB.NET-Projekt).

    
wllmsaccnt 16.02.2011 21:29
quelle
1

Ich denke, Microsoft wollte den Entwicklern Freiheit geben. Keine Einschränkungen, wenn nicht notwendig. C # wird nicht von CLS eingeschränkt, da nicht jeder Interoperabilität mit VB benötigt.

    
Tomas Voracek 16.02.2011 21:39
quelle
0

Wenn es eine universelle Übereinstimmung darüber gäbe, welche Funktionen in einer Programmiersprache enthalten sein sollten, würde die Welt nur eine Programmiersprache benötigen (die genau die Funktionen beinhalten würde, die alle akzeptieren sollten). Natürlich werden in der Realität einige Leute als wichtige Eigenschaften betrachten, die andere nicht interessieren (oder sogar geschmacklos finden). Der CLS-Standard macht im Wesentlichen drei Dinge:

  1. Es besagt, dass bestimmte Funktionen so wichtig sind, dass jede Sprache, die sie nicht enthält, als unzureichend für die universelle .net-Programmierung betrachtet werden sollte.
  2. Es besagt, dass Programmierer, deren Bibliotheken keine anderen als die aufgelisteten Funktionen benötigen, erwarten sollten, dass ihre Bibliotheken von Programmierern verwendet werden können, die eine beliebige Sprache verwenden, die für allgemeine .net-Programmierung geeignet ist.
  3. Es informiert Programmierer darüber, dass, wenn Teile ihrer Bibliotheken die Verwendung von Funktionen erfordern, deren Sprachen nicht unterstützt werden müssen, diese Teile möglicherweise nicht in Sprachen verwendbar sind, die für .net-Programmierung geeignet sind, aber nicht die erforderlichen Funktionen enthalten .

Wenn Sprachen wie vb.net oder C # die Erstellung von nicht CLS-konformer Programmierung erlauben, bedeutet das, dass Microsoft entschieden hat, dass bestimmte Funktionen nützlich genug sind, um die Einbindung in diese Sprachen zu rechtfertigen, aber nicht so wunderbar oder nicht umstritten Sie müssen alle Sprachen enthalten.

    
supercat 14.11.2012 22:58
quelle

Tags und Links