なぜDateTime.Monthがintなのですか?


9

C#では、DateTimeプロパティMonthのタイプはint(32ビットの符号付き整数)ですが、その範囲は1〜12のみです。C#チームが(8ビットの符号なし整数)intなどの小さい数値型を選択した理由は何byteですか?


5
C#設計チームの誰かが潜んでいない限り、これに対する答えが得られるかどうかは
わかり

1
@Liathそれは私が恐れているのを助けません、公式の答えを持つことができるかどうか、言語仕様で「なぜ」が「主意見ベース」と見なされるのかを尋ねていますか?(ちなみに、C#言語デザイナーからの説明)
gnat

ところでDateTimeとしてCoreFXに実装単一の64ビット値として時間をコードします。日や月などの情報は、その値から巧妙な数学(GetDatePart())を介して抽出されます。これはintを戻り値として使用する理由ではなく、欠点はありません。アラインメントの問題のため、関数からバイトを返すことは、intを返すことよりも効率的ではないことにも注意してください。
アモン

3
それがと呼ばれる型ではない理由を尋ねたくなるでしょうMonth
bdsl 2018

おそらくそれは、内部で実行される操作がintを必要としたためであり、コンパイラの設計者は、おそらくパフォーマンス上の理由から、それを別のものに変換する価値がないと判断しました。
NoChance 2018年

回答:


23

int.NETのほとんどすべての整数変数に使用されますが、多くの場合、より小さな型で十分です。また、符号なしの型は使用されることはありますが、ほとんど使用されません。

いくつかの理由:

  1. 符号付きタイプと符号なしタイプ、および異なるサイズの整数タイプは、それらを組み合わせると(+または<たとえば)、扱いにくくなる可能性があります。ルールは明らかではありません。私は経験豊富な開発者であり、すべてのルールを説明することはできません。私は知る必要はありません。
  2. intすべての一般的なアーキテクチャで高速です。型が小さいと、変換が遅くなることがよくあります。
  3. 一般的なコードの99%ではパフォーマンスは問題になりません。これを考え直す必要はありません。intどこでも使用してください。
  4. 意図が明確なので可読性はとても良いです。Aは、byte例えば、バイナリデータを示唆しています。(Flaterによるコメントを参照してください。)

を使用すると便利ですint


ありがとう、これらはいくつかの大きな理由です。小規模から大規模、または符号なしから符号付きに変換することによるパフォーマンスへの影響については、コードで暗黙的に考えているため、考えたことはありません。
Frayt '19

はい、実際には、intではなくバイトを使用してコードを1回遅くしました。intを使用してください; +)
Joel Harkes

1
別の要因は、「誰もがデフォルトでintを実際に好む」ことであり、設計者は型の不一致の驚きを望んでいませんでした。
SD

1
他の点では完全な答えに加えて、読みやすさはintを使用するもう1つの理由です。byteプロパティを見たとしても、それが自動的に数値であるとは思わないでしょう。バイトは多くのものになる可能性があります(たとえば、ブール値の圧縮されたコレクション)。もう少し先に進めば、誰もがAを見byte[]て「自分は最適化されているに違いない」と自分自身で考えるとは思えませんList<int>
2018

2
ポイント3は、この回答のポイント2と矛盾しています。おそらく、より良い「ポイント3」になり、「典型的なコードの99%については、のメモリオーバーヘッド『intとしてヶ月バイトヶ月』 VS 『が』問題ではありません。
ドク・ブラウン

4

月は値ではありません。1か月は1か月です。

1〜12のマッピング(0〜11のimoである必要があります)は、それを使って簡単に計算できるようにするためだけに作成されています。

そして、それを使って数学を始めたら、実用的でなければなりません。Intは整数演算のデフォルトです。それらを使用してください。

それはプログラマーが期待することです。コンテキストなし:intを期待します。

1月が1(または0)であるかどうかに関心がないので、「この借金を支払うまでの月々の分割払いの数」などの質問への回答に関心があります。そして、あなたはあなたがバイトの代わりに整数を使うべきだったことがわかります。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.