Hallo Community,
bei (fast) allen Klassen in System.Collections.Generic, steht in der Dokumentation zu lesen: "This class is not CLS-compliant"; gilt analog auch für deren Eingeschaften, Methode usw.
Welche konkrete Bedeutung hat das (was CLS heißt und was der Satz auf deutsch sagt, ist mir schon klar) und welche praktischen Auswirkungen hat das? Provokant gefragt: Sollte man System.Collections.Generic überhaupt benutzen?
Vielen Dank!
herbivore
Ich verstehe das so das der Namespace "Generic" nicht Abwärtskompatible ist,
da MS ja einen anderen Weg gegangen ist als Sun mit Java.
Aber was ich mir noch Vorstellen kann, das der Namespace noch nicht
standardisiert ist. Und somit wollen sie nur sagen das sich da noch was tun kann.
CLS-Compliant ist eine Untermenge von dem was mit IL möglich ist. Alle .Net-Sprachen müssen mindestens diesen Feature-Satz unterstützen. Dadurch ist sichergestellt, dass die Sprachen untereinander kompatibel sind, dass man z.B. VB.Net-Dlls in C# verwenden kann.
Werden als "Nicht CLS-Compliant" gekennzeichnete Typen, Sprachfeatures (Beispiel: Zeiger) usw. verwendet, können die Assemblies nicht mehr von allen Sprachen verwendet werden. Die unsigned Zahlentypen uint, ulong usw. sind z.B. nicht CLS-Compliant. Ich glaube J# kann mit diesen Typen nicht umgehen. In Java gibt es jedenfalls keine unsigned Typen. Genauso ist es mit Generics, die wenigsten Sprachen unterstützen sie (im Moment nur C#?).
Es geht aber immer nur um die öffentliche Schnittstelle. Es ist egal, ob man in der Implementierung Generics verwendet. Solange man sie nicht in der Schnittstelle veröffentlicht, kann jede andere .Net-Sprache mit dem Code was anfangen.
Gruss
Pulapex
Genauso ist es mit Generics, die wenigsten Sprachen unterstützen sie (im Moment nur C#?).
Ich glaub eher in allen 5 .NET Sprachen vom Hause Microsoft. Zumindestens gibts für
jede Sprache eine Dokumentation zu den Generic-Klassen. Bin mir bei VB.NET und
C++/CLI sogar ziemlich sicher.
Ich sag mal so, du brauchst dir keine Sorgen machen über nicht CLS konforme Klassen, denn
zwar hat man in J#, und VB.NET imho auch, keine unsigned Datentypen zur Verfügung, aber es
bleibt ja immerhin noch System.UInt16 etc. über ..
Weiteres Beispiel für eine nicht CLS konforme Klasse wär zum Beispiel:
public class Person
{
public string name {
get { / * ... */ }
}
public string Name {
get { / * ... */ }
}
}
grüße
UInt16 ist genauso wenig CLS-konform, short ist ja nur ein Alias in C# für UInt16. Ansonsten ist es ein und der selbe Datentyp. Aber hast Recht damit, dass es schon mehrere Sprachen gibt, die Generics unterstützen.
UInt16 ist genauso wenig CLS-konform, short ist ja nur ein Alias in C# für UInt16. Ansonsten ist es ein und der selbe Datentyp.
Naja, ausprobiert hab ichs jetzt nicht, aber wiederum gibts eine Doku für
UInt** Typen im .NET Framework für mehrere Sprachen.
grüße
Wenn ich mich recht entsinne, sind auch C# jagged arrays nicht CLS konform. Das heisst nicht, dass man sie nicht benutzen darf, aber in Schnittstellen dürfen diese Typen nicht vorkommen um interoperabel zu sein.
Ein Array ist ein Verweistyp, im Ursprung abgelitten von System.Object. Ein "Jagged Array" ist ein normales, eindimensionales Array, dessen Elemente Arrays sind (wie gesagt normale Objekte).
Ich wüsste nicht, warum es an der Stelle Beschränkungen in der "Common Language Specification" geben sollte. Aber vielleicht findest du ja den Link wo du das gelesen hast. Lasse mich gerne überzeugen.
Gruss
Pulpapex
// Edit: der (Geist-)Moderator, der diesen Thread geschlossen hat, sollte vielleicht noch einen Grund angeben. Kommt ansonsten gar nicht gut.
// Edit: Ok, nach knapp einer Stunde keine Reaktion. Thread ist wieder offen.
http://msdn.microsoft.com/msdnmag/issues/02/02/NET/
"**Note that jagged arrays are not CLS-compliant **(because the CLS doesn't allow a System.Array object to be an element of an array) and cannot be passed between code written in different programming languages."
In der Msdn-Doku zum .Net-Framework steht nichts genaues. Da steht in Sachen CLS-Konformität bei Arrays nur:
Arrays
Element types
Array elements must be CLS-compliant types.
Dimensions
Arrays must have a fixed number of dimensions, greater than zero.
Bounds
All dimensions of an array must have a zero lower bound.
Da steht nichts gegen "jagged Arrays". Im Netz findet man aber häufiger die Bemerkung, dass sie nicht konform wären.
Ich hab dann nochmal in die Spezifikation geguckt. Da steht:
CLS Rule 16: Arrays shall have elements with a CLS-compliant type and all dimensions of the array shall have lower bounds of zero. Only the fact that an item is an array and the element type of the array shall be required to distinguish between overloads. When overloading is based on two or more array types the element types shall be named types.
Note: so-called “jagged arrays” are CLS-compliant, but when overloading multiple array types they are onedimensional, zero-based arrays of type System.Array.
"jagged Arrays" sollen also konform sein mit einer Einschränkung. Weiss jemand wie man die Einschränkung deuten soll?
... but when overloading multiple array types they are onedimensional,
zero-based arrays of type System.Array.
Tja, wie gesagt, mein Zitat WAR aus MSDN.
Hier weitere:
CodeProject-Artikel über Array-Typen:
" Keep in mind, that jagged arrays are not CLS-compliant and may not be worked cross-language."
http://codeproject.com/dotnet/arrays.asp
Doku FxCop:
" Keep in mind, that jagged arrays are not CLS-compliant and may not be worked cross-language."
http://www.gotdotnet.com/team/libraries/FxCopRules/PerformanceRules.aspx
Aus "Visual Basic Language Concepts" von Microsoft:
"Note Jagged arrays are not compliant with the common language specification (CLS). This means you should not expose jagged arrays from any class you want CLS-compliant code to consume."
http://msdn.microsoft.com/library/en-us/vbcn7/html/vaconarraysofarrays.asp
Ich habe dagegen nicht einen Link gefunden, wo das Gegenteil behauptet wurde....
Habs auch mal so in einer Schulung gelernt. Selbst hab ich die jagged Arrays noch nie verwendet....
Noch ein Nachtrag: Angeblich sollen jagged Arrays in der .NET Beta mal CLS-compliant gewesen sein.