Laden...

Warum gibt es in C# Schlüsselwörter für Datentypen?

Erstellt von MyTrinom vor 9 Jahren Letzter Beitrag vor 9 Jahren 4.405 Views
M
MyTrinom Themenstarter:in
5 Beiträge seit 2014
vor 9 Jahren
Warum gibt es in C# Schlüsselwörter für Datentypen?

Warum hat man Schlüsselwörter eingeführt. Was spricht gegen die Benutzung von Int16, Single, Decimal, Char, usw. ?

16.835 Beiträge seit 2008
vor 9 Jahren

Andersrum. Int32 ist ein Alias fuer 'int', Int16 fuer short.. Etc etc
Warums Aliase gibt? Komfort, Kompatibilitaet, einfacher zu verstehen...

Der Compiler kennt nur int, nicht Int32.

Das sind uebrigens mehr oder minder Grundlagen....

M
MyTrinom Themenstarter:in
5 Beiträge seit 2014
vor 9 Jahren

Das sind uebrigens mehr oder minder Grundlagen....

In den Büchern, aus denen ich lerne steht nicht drinne warum es gemacht wird. Vielleicht hätte es ich es mir auch selbst überlegen können.

Danke für deine Antwort.

2.079 Beiträge seit 2012
vor 9 Jahren

Du kannst dir ja mal unter referencesource.microsoft.com/#mscorlib/system/int32.cs den Sourcecode von Int32 anschauen.

Die Struktur ist recht einfach zu verstehen und im Prinzip wird nur eine int-Variable namens m_value gehalten und jede Methode auf sie ausgeführt.
Frag mich aber nicht, was der ganze auskommentierte Haufen unten soll 😄

NuGet Packages im Code auslesen
lock Alternative für async/await

Beim CleanCode zählen nicht die Regeln, sondern dass wir uns mit diesen Regeln befassen, selbst wenn wir sie nicht befolgen - hoffentlich nach reiflichen Überlegungen.

49.485 Beiträge seit 2005
vor 9 Jahren

Hallo MyTrinom,

die Schlüsselworte int, short, float, ... gibt es ja schon seit C und sie sind ganz natürlich von C über C++ (und Java) nach C# übernommen worden. Sie sind also (erst) nicht in C# eingeführt worden, sondern waren zuerst da. Das neue ist, dass sie C# einfach als Aliase für die entsprechenden von dir genannten Klassen bzw. Strukturen definiert sind. Und das hat wiederum damit zu tun, dass diese Typen in allen Programmiersprachen, die auf der CLR basieren, eine einheitliche Basis haben sollen/müssen, um die Interoperabilität zu gewährleisten.

Hallo Abt,

Andersrum. Int32 ist ein Alias fuer 'int', Int16 fuer short.. Etc etc

nein, das ist nicht korrekt. Int ist - an den allermeisten Stellen(*) - ein Alias für (System.)Int32. Jedenfalls ist Int32 kein Alias für int.

Folgende Belege:

Built-In Types Table (C# Reference):

The following table shows the keywords for built-in C# types, which are aliases of predefined types in the System namespace.

ECMA-334 C# lang spec (page 18):

Each of the predefined types is shorthand for a system-provided type. For example, the keyword int refers to the struct System.Int32. As a matter of style, use of the keyword is favored over use of the complete system type name.

Dort steht zwar shorthand und refers statt alias, aber in der Richtung, die ich sage.

Davon abgesehen könnte ein Struct wie Int32 höchstens ein Wrapper für int sein, kein Alias. Und selbst ein Wrapper ist er nicht. Warum in der Implementierung von System.Int32 das Schlüsselwort int verwendet werden kann, um eine Membervariable zu deklarieren, erklärt Eric Lippert - und der muss es wissen - in If Int32 is just an alias for int, how can the Int32 class use an int? Dort hätte also genauso gut Int32 für die Variablendeklaration verwendet werden können.

Auch im Internet findet man im Grunde nur die Richtung "int ist ein Alias für Int32", nicht umgekehrt. Alles andere wäre auch - sorry - Unsinn.

herbivore

(*) Die Spezifikation des Typs eines Enums, ist eine der Ausnahmen.

16.835 Beiträge seit 2008
vor 9 Jahren

Okay, wenn Du es doch hier klären willst, statt per PN.
Viele Aussagen, die man liest - auch EMCA -, machen so keinen Sinn.

public enum Foo : int

klappt.

public enum Foo : Int32

nicht.

Würde es wirklich int -> Int32 sein, würde dies kein Problem darstellen.
Weiterhin verwendet der Int32 Struct-Quellcode "int"; rein in der Theorie ergo eine Endlosschleife. Aber das lässt sich über "Magic" lösen.

Du hast bisher weder meine Argumente widerlegt noch hast Du ausreichend bewiesen, wieso das "Unsinn" sein sollte.
Und dass die ECMA 2-3 Dinge nicht 100% klar ausdrückt ist auch hinlänglich bekannt.
Dass bei beiden am Ende das gleiche raus kommt, keine Frage.

Einzig die Tatsache, dass Int32 ein CTS sein wird, würde es schlüssig erklären.
Das heisst zeitgleich, dass der Compiler - wie Du sagst - aus int Int32 macht. Im ILCode steht ja auch nachher das identische.
Trotzdem wäre das ein inkonsistentes Verhalten des Compilers bzgl. meinen Beispielen - und da gibts auch noch andere.

Gib mir eine schlüssige Argumentation, wieso Int32 bei Enums nicht funktioniert.
Die ECMA besagt

An enum declaration may explicitly declare an underlying type of byte, sbyte, short, ushort, int, uint, long or ulong. Note that char cannot be used as an underlying type. An enum declaration that does not explicitly declare an underlying type has an underlying type of int.

Wo ist hier aber der Sinn, wenn denn int 100% Int32 ist?
Alles was man dazu findet endet mit: es macht keinen Sinn.

49.485 Beiträge seit 2005
vor 9 Jahren

Hallo Abt,

dass es bei enums eine Ausnahme gibt, hatte ich bereits geschrieben. Warum das eine Ausnahme ist, weiß ich nicht, vielleicht finde ich es noch heraus, dann schreib ichs(*). Aus der Existenz einer Ausnahme kann alleine man aber nicht schließen, dass die Richtung umgekehrt sein muss. Ist sie auch nicht.

Auf das Gegenargument mit der Endlosschleife bzw. Endlosrekursion bei der Implementierung von Int32 bin ich ebenfalls bereits in meiner ersten Antwort eingegangen.

Unsinn ist aus meiner Sicht, dass du zwar Argumente bringst, die auf den ersten Blick gegen meine Richtung sprechen können, aber aus meiner Sicht keinen schlüssigen Beleg bringst, der deine Richtung stützt. Irgendwas aus der MSDN oder so, wo steht, dass die Alias-Beziehung in der Richtung besteht, die du sagst.

herbivore

(*) EDIT: Siehe zum Beispiel in C# int, Int32 and enums. Also möglicherweise einfach nur ein "Bug" im Parser bzw. Bequemlichkeit der Parser-Implementierer. Auch in dieser Antwort steht übrigens: "... the C# specification defines the int keyword as explicit alias System.Int32 ...".

16.835 Beiträge seit 2008
vor 9 Jahren

Gut, dann bin ich auf die Antwort gespannt, wieso es bei enums eine Ausnahme gibt - und ausgerechnet dort.
Dass int ein Keyword ist und Int32 ein CTS; da geh ich mit. Aber das reicht mir als Antwort nicht.

Vor allem find ich die Aussage "Alias" immer noch suboptimal, da es eben nachweislich doch Unterschiede - zumindest im Handling - gibt.

M
MyTrinom Themenstarter:in
5 Beiträge seit 2014
vor 9 Jahren

Als Anfänger finde ich das hier alles ziemlich verwirrend, könnt ihr euch das vorstellen? 😄. Wäre nett, wenn ich am Ende ein Fazit des Ganzen bekommen könnte.

6.911 Beiträge seit 2009
vor 9 Jahren

Hallo MyTrinom,

als Fazit kannst du herbivores Antwort nehmen. Die ist korrekt und gültig.

mfG Gü

Stellt fachliche Fragen bitte im Forum, damit von den Antworten alle profitieren. Daher beantworte ich solche Fragen nicht per PM.

"Alle sagten, das geht nicht! Dann kam einer, der wusste das nicht - und hat's gemacht!"

5.658 Beiträge seit 2006
vor 9 Jahren

Die Frage war ja nicht, warum das so ist, sondern:

Was spricht gegen die Benutzung von Int16, Single, Decimal, Char, usw. ?

Die Antwort darauf lautet natürlich: Nichts.

Christian

Weeks of programming can save you hours of planning

2.079 Beiträge seit 2012
vor 9 Jahren

Also einziges, aber eher schwaches, Gegenargument sehe ich die Lesbarkeit.

Es mag Geschmackssache sein, aber ich finde Code deutlich angenehmer zu lesen, wenn die entsprechenden Schlüsselwörter für den jeweiligen Typ verwendet werden.

Ich habe auch schon an manchen Stellen gelesen, dass das bei der Arbeit an Projekten gewünscht ist und bei ins im Betrieb steht das auch so in der Guidline.

NuGet Packages im Code auslesen
lock Alternative für async/await

Beim CleanCode zählen nicht die Regeln, sondern dass wir uns mit diesen Regeln befassen, selbst wenn wir sie nicht befolgen - hoffentlich nach reiflichen Überlegungen.

49.485 Beiträge seit 2005
vor 9 Jahren

Hallo MrSparkle,

Was spricht gegen die Benutzung von Int16, Single, Decimal, Char, usw. ?
Die Antwort darauf lautet natürlich: Nichts.

naja, zumindest die C# Sprachspezifikation spricht (sich) dagegen (aus), wenn auch nur aus stilistischen Gründen (weiter oben ist das volle Zitat inkl. Fundstelle zu finden):

As a matter of style, use of the keyword is favored over use of the complete system type name.

Ob man der Empfehlung folgen mag, halte ich allerdings für Geschmackssache. Ich persönlich verwende die Typ-Schlüsselworte, außer object und string, weil mir da die Klassen String und Object naheliegender erscheinen als die Schlüsselworte. Aber auch das ist nur meine Meinung.

herbivore

P
1.090 Beiträge seit 2011
vor 9 Jahren

Irgendwo hatte ich jetzt noch im Hinterkopf, das int (bzw double), den anderen Zahlen Typen vorgezogen werden sollten. Wenn nichts dagegen spricht.

Für int hab ich jetzt hier ( Why should I use int instead of a byte or short in C#) eine Begründung gefunden. Das mit dem 32Bit Block kling für mich jetzt ganz schlüssig.

Für double gab es da auch eine ähnliche Begründung.

MFG
Björn

Sollte man mal gelesen haben:

Clean Code Developer
Entwurfsmuster
Anti-Pattern