int
、long
、ushort
、uint
、などshort
。
の省略形がないのはなぜSystem.DateTime
ですか?
多くの型は、C# の "省略形" キーワードに関連付けられています。たとえば、
System.Int32
書くこともできますし、書くこともint
できSystem.String
ますstring
。の省略形がないのはなぜSystem.DateTime
ですか?
その質問に答える前に (というか、答えられないかもしれませんが)、まず C# で略記を持つ型に注目しましょう。彼らです
object
string
sbyte byte short ushort int uint long ulong
char
bool
decimal double float
最初に、他の回答のいくつかに対処しましょう。
Mystere Man は、これらのキーワードのいくつかが C から来ていることを正しく指摘しています。C にはint
、やや冗長なunsigned int
、double
、およびその他のいくつかがあります。ただし、 Cにはbool
、、、、またはがありません。long
decimal
object
string
int
キーワードなどを含める正当な理由の 1 つchar
は、C や C++ に慣れているユーザーが C# ですぐに生産できるようにするためであると合理的に言えると思います。ここでの目的は、キーワードが C プログラマーにとってなじみ深いものになることですが、これらのキーワードが C と同じセマンティクスを持つことは絶対に目的ではありませんでした。C はそれらのサイズを指定しません。たとえば、int
マシンの「自然なサイズ」になることを強くお勧めします。C# では、各型の正確なサイズと範囲が指定されています。
したがって、省略形を持たないSystem.DateTime
ことの正当化は、C には何もなかったからであるstring
と合理的に言うことはできないと思いdecimal
ます。
Jason は、これDateTime
は「C# 言語の一部」ではないため、キーワードがないと指摘しています。しかし、それは徹底的に疑問を投げかけています! 質問は基本的に「OK、では、なぜ DateTime は C# 言語の一部ではないのですか?」ということです。同じ難易度の質問に回答する必要があるような方法で質問に回答することを「質問を請う」と呼び、この質問は徹底的に請願されています。
「基本的な」タイプとは何かを検討することは有益です。C# でキーワードを持つすべての型は、.を除いてdecimal
、ある意味で「非常に特別」です。object
つまり、基礎となるランタイムには、ユニバーサル基本型であるため、明らかに特別な動作が組み込まれています。string
単に の配列である可能性がありますがchar
、そうではありません。弦は特別です。(それらはインターンできる、定数である、メタデータに存在できるなどの理由で。) 整数型およびバイナリ浮動小数点型はすべて、それらの操作のためにフレームワークに組み込まれた特別な処理を持っています。
しかし、これSystem.Decimal
は別の構造体型です。これは 128 ビットの整数と、多数のユーザー定義演算子です。必要に応じて、誰でも独自の 10 進算術型を実装できます。しかし、C# 言語の一部にすることによる「祝福」System.Decimal
は、その変換がメソッドとして実装されていても、ユーザー定義の変換としてではなく、組み込みの変換として扱うことを意味します。
本当にdecimal
奇妙なものです。ランタイムの「基本」タイプではありませんが、キーワードです。
しかし、これは興味深い点をもたらします。System.IntPtrとSystem.UIntPtrは、ランタイムの基本的な型です。それらは「ポインタサイズの整数」型です。それらは C が と で意味するものint
ですunsigned int
。これらの型は .NET ランタイムの型システムの基本ですが、キーワードに恵まれていません。
したがって、「基本的な」タイプのみがキーワードを取得するという議論を拒否できます。キーワードを取得した非基本型と、キーワードを取得しなかった基本型が存在するため、基本型とキーワードを取得した型の間には 1 対 1 の関係はありません。
ティグランは、選択は「歴史的」だったと意見を述べています。これは正しいですが、実際には質問に答えていません.
Hans Passant は、int のサイズと範囲を明確に指定すると、ネイティブの整数サイズが変更された場合でも言語の動作を一貫させるのに役立つことを正しく指摘し、DateTime
すでに「将来の証明」になるように設計されていることを指摘しています。この分析は正しいのですが、10 進数がキーワードになっている理由が説明されていません。将来、マシンの「ネイティブ 10 進サイズ」が変更される心配はありません。さらに、C# 言語では、double は常に 8 バイトのストレージを消費しますが、C# が double の処理をわずか 64 ビットの精度に制限する必要はないことをすでに指摘しています。実際、C# プログラムは 80 ビット以上の精度で倍精度演算を行うことがよくあります。
これらの回答のいずれも、問題にうまく対処しているとは思いません。それでは、質問に戻りましょう。
多くの型は、C# の "省略形" キーワードに関連付けられています。たとえば、
System.Int32
書くこともできますし、書くこともint
できSystem.String
ますstring
。の省略形がないのはなぜSystem.DateTime
ですか?
この質問に対する答えは、「なぜ C# は私が気に入った機能を実装していないのですか?」という形式のすべての質問に対する答えと同じです。答えは次のとおり です。機能を実装しない理由を提供する必要はありません。機能は高価であり、Raymond Chen がよく指摘するように、デフォルトでは実装されていません。未実装の機能を未実装のままにしておくのは簡単です。
機能の提案はまったく不合理ではありません。Visual Basic はある意味でDateTime
特別な型として扱われます。C# も、その作業を行う価値があると判断した場合は可能です。しかし、妥当な機能がすべて実装されるわけではありません。
C#言語のInt32、Int64などのエイリアスは、言語を将来にわたって利用できるようにするために存在します。誰もがデスクトップマシンに256ビットコアを持っている場合でも、それを適切にするため。整数のヘミングとそれを実際に実現するための努力により、その周りにあるC#コードの量は、intが32ビットであると暗黙的に想定しています。しかし、実際にはそれほど難しくはありませんでしたが、私が書いたコードのチャンクをCP / MからMS-DOS、Windows 3.x、Windows NTに、驚くほど少ない労力で移動しました。
これはDateTimeの問題ではありません。10,000年まで将来にわたって利用できます。私はそれまでに、私が入力したものではなく、私が意味したことをマシンが理解することを信頼し、願っています:)
BCL / .NETチームの誰か以外の誰もが本当の答えを出すことはできませんが、それは単に歴史的な理由であると思います。他の人はありません。char
float
int
uint
.NETで.NET Framework type
省略形を使用しているため、他の型についても同じ質問をすることができますが、これは参照型です。それで...string
string
私が説明されることを願っています。