2015-12-09 9 views
5

なぜtypeof(string).FullNameSystem.Stringで、stringではありませんか?同じことがintfloatdouble、...なぜ 'typeof(string).FullName'は 'string'ではなく 'System.String'を指定していますか?

私はtypeofは、指定されたタイプのためSystem.Typeオブジェクトを返していることを理解し、なぜstringでもSystem.Type対象にならないように、他の全ての「シンプル」タイプでありますか?

stringはC#言語の一部であり、System.Typeはシステムライブラリの一部ですか?

+4

STRING'は 'ので、それはあります'System'名前空間にある' System.String'クラスのエイリアスです。 'typeof(string).Name'を使うと、クラス名' String'だけが得られます。 –

+1

上記の_Tim Schmelter_のコメントに加えて、同じことがプリミティブについても言える: 'typeof(int).FullName'は' int'を返すが、 'typeof(Int32).FullName'は' System.Int32'を返す。 System.Stringとstringはまったく同じで、好みに基づいて使用されます。私は個人的にはフィールドに 'string'を使い、' String.Empty'や 'String.Format(...)'のような静的メソッド/定数には 'String'を使います。私はいつもすべてが同じであると思っていましたが、そのタイプのFullNameも異なっています。この質問のおかげで、今でも新しいことを学んだので。 :) –

答えて

11

stringSystem.Stringの別名です。 string C#コードはコンパイル時にSystem.Stringに変換されます。これはother aliasesと同じです。

+0

その間にスピードに違いはありませんか?私はSystem.Typeがもっと複​​雑だと思ったのですか? –

+2

'string'は完全な100%の' System.String'です。 –

1

C#では、stringSystem.Stringのエイリアスであるため、両方とも同じで、typeofは同じ型オブジェクトを返します。

他のすべてのプリミティブ型についても同じです。たとえば、intは、System.Int32のエイリアスです。

あなたがタイプの短いC#のエイリアス名を取得する必要がある場合は、代わりにFullNameCSharpCodeProvider.GetTypeOutput()を使用することができます。

using Microsoft.CSharp; 

[...] 

var compiler = new CSharpCodeProvider(); 
var type = new CodeTypeReference(typeof(Int32)); 
Console.WriteLine(compiler.GetTypeOutput(type)); // Prints int 

を(this questionから取られたコードスニペット)

+0

ヒントをお寄せいただきありがとうございますが、CSharpCodeProviderを作成するのは、これを高価にするのではなく、特に頻繁に行うのであれば、 –

+0

私はそれを測定しませんでしたが、これを非常に頻繁に行う必要がある場合は、C#の名前を 'Dictionary 'またはそのようなものにキャッシュすることをお勧めします。名前が必要な場合は、辞書で検索してください。それに含まれていない場合は、遅い 'GetTypeOutput'を実行して辞書に保存します。 –

+1

10.000回試してみると11ミリ秒かかるしたがって、パフォーマンスは問題ではありません。 –

関連する問題