Warum ist DateTime.Month ein Int?

9

In C # hat die DateTimeEigenschaft Montheinen Typ int(eine 32-Bit-Ganzzahl mit Vorzeichen), ihr Bereich beträgt jedoch immer nur 1-12. Was sind die Gründe, warum sich das C # -Team für inteinen kleineren numerischen Typ entschieden hat, z. B. byte(8-Bit-Ganzzahl ohne Vorzeichen)?

Frayt
quelle
5
Wenn nicht jemand aus dem C # -Design-Team lauert, bin ich mir nicht sicher, ob Sie eine Antwort darauf erhalten ...
Liath
1
@Liath , die nicht helfen, ich habe Angst, sehe Fordert „Warum“ auf Sprachdaten noch als als „primäre Meinung Basis“ , wenn es offizielle Antworten haben kann? (übrigens eine Erklärung von C # Sprachdesigner)
Mücke
Übrigens, DateTimewie in CoreFX implementiert, codiert die Zeit als einen einzelnen 64-Bit-Wert. Informationen wie Tage oder Monate werden aus diesem Wert durch eine clevere Mathematik ( GetDatePart()) extrahiert . Dies ist kein Grund für die Verwendung eines int als Rückgabewert, es hat nur keine Nachteile . Beachten Sie auch, dass die Rückgabe eines Bytes von einer Funktion aufgrund von Ausrichtungsproblemen nicht effizienter ist als die Rückgabe eines int.
Amon
3
Ich wäre versucht zu fragen, warum es kein Typ namens ist Month.
BDSL
Dies liegt höchstwahrscheinlich daran, dass für die intern ausgeführten Vorgänge ein int erforderlich war und die Compiler-Designer entschieden haben, dass es sich aus Leistungsgründen nicht lohnt, es in etwas anderes zu konvertieren.
NoChance

Antworten:

23

intwird für fast alle ganzzahligen Variablen in .NET verwendet, obwohl häufig ein kleinerer Typ ausreicht. Außerdem werden vorzeichenlose Typen fast nie verwendet, obwohl dies möglich ist.

Einige Gründe:

  1. Vorzeichenbehaftete und vorzeichenlose Typen sowie ganzzahlige Typen unterschiedlicher Größe können beim Kombinieren ( +oder <beispielsweise) umständlich sein . Die Regeln sind nicht offensichtlich. Ich bin ein erfahrener Entwickler und konnte Ihnen nicht alle Regeln nennen. Ich muss es nicht wissen.
  2. intist schnell auf allen gängigen Architekturen. Kleinere Typen führen häufig zu langsameren Conversions.
  3. Die Leistung ist für 99% des typischen Codes kein Problem. Keine Notwendigkeit, dies zu überdenken. Einfach intüberall verwenden.
  4. Die Lesbarkeit ist sehr gut, da die Absicht klar ist. A bytewürde zum Beispiel binäre Daten vorschlagen. (Siehe Kommentar von Flater.)

Es ist eine nützliche Konvention int.

usr
quelle
Danke, das sind einige gute Gründe. Ich habe nie über die Auswirkungen der Konvertierung von klein zu groß oder von nicht signiert zu signiert nachgedacht, da dies alles im Code impliziert ist.
Frayt
Ja, ich habe den Code tatsächlich einmal langsamer gemacht, indem ich Bytes anstelle von Ints verwendet habe. Verwenden Sie einfach Ints. +)
Joel Harkes
1
Ein weiterer Faktor könnte sein, dass "jeder standardmäßig int bevorzugt" und die Designer keine Überraschungen bei der Nichtübereinstimmung von Typen wollten.
SD
1
Neben einer ansonsten vollständigen Antwort ist die Lesbarkeit ein weiterer Grund für die Verwendung von int. Wenn ich eine byteEigenschaft sehen würde, würde ich nicht automatisch denken, dass es sich um einen numerischen Wert handelt. Ein Byte kann viele Dinge sein (z. B. eine komprimierte Sammlung von Booleschen Werten). Etwas weiter gedrängt bezweifle ich, dass sich jemand einen ansehen würde byte[]und denkt sich "aha, das muss ein optimierter sein List<int>".
Flater
2
Punkt 3 widerspricht Punkt 2 in dieser Antwort. Wahrscheinlich wäre ein besserer "Punkt 3" "Für 99% des typischen Codes ist der Speicheraufwand von" Monaten als int "gegenüber" Monaten als Bytes "kein Problem.
Doc Brown
4

Ein Monat ist kein Wert. Ein Monat ist nur ein Monat.

Die 1-12-Zuordnung (die 0-11 imo hätte sein sollen) dient nur dazu, das Rechnen einfacher zu machen.

Und wenn Sie damit anfangen zu rechnen, müssen Sie pragmatisch sein. Ints sind die Standardeinstellung für Ganzzahlmathematik. Also benutze diese.

Das erwarten Programmierer. Ohne Kontext: Erwarten Sie eine int.

Da Sie nicht daran interessiert sind, ob der Januar der 1. (oder der 0) ist, interessieren Sie sich für Antworten auf Fragen wie: "Wie viele monatliche Raten, bis ich diese Schulden bezahlt habe?". Und dann stellen Sie fest, dass Sie die Ganzzahl anstelle des Bytes hätten verwenden sollen.

Pieter B.
quelle