2015-12-09 27 views
5

Neden typeof(string).FullNameSystem.String veriyor ve string kullanıyor? Aynı int, float, double ...Neden 'typeof (string) .FullName' 'System.String' veriyor ve 'string' değil mi?

Ben typeof verilen türü için System.Type nesne dönüyor anlıyoruz, ama neden string olduğunu da System.Type nesne olmayacaktır gibi tüm diğer "basit" türleriyle mı?

string, C# dilinin bir parçası olduğundan ve System.Type sistem kitaplıklarının bir parçası olduğu için mi?

+4

'string' olduğu O çünkü 'System' ad alanında oturan' System.String' sınıfı için bir takma ad. 'Typeof (string) .Name' kullanırsanız, yalnızca 'String' classname alırsınız. –

+1

_Tim Schmelter_'ın yukarıdaki yorumuna ek olarak: Aynı şey ilkeller için de söylenebilir: 'typeof (int) .FullName' int 'değerini döndürecektir, ancak 'typeof (Int32) .FullName' System.Int32'yi döndürecektir. System.'String' ve 'string' tam olarak aynıdır ve tercihlere göre kullanılır. Ben şahsen 'string' alanlarını ve 'String' 'String.Empty' veya 'String.Format (...)' gibi statik yöntemler/sabitler için kullanırım. Her zaman aynı şeylerin aynı olduğunu düşünürdüm, ama görünüşe göre onların türü FullName de farklı. Bu soru için teşekkürler, çünkü şimdi yeni bir şeyler öğrendim. :) –

cevap

11

string, System.String için bir takma addır. string C# kodunuz derleme zamanında System.String'a dönüştürülür. Bu other aliases için aynıdır. C#

+0

Yani aralarında Hız farkı yok mu? System.Type daha 'karmaşık' olduğunu düşündüm? –

+2

Hayır. 'string' tam% 100 için' System.String' dir. –

1

, string sadece System.String için bir takma, yani her ikisi de aynı ve typeof aynı tip nesnesini geri gönderir.

Aynı şey diğer tüm ilkel türler için de geçerlidir. Örneğin, int yalnızca System.Int32 için bir diğer addır. Eğer bir tür kısa C# takma adını almak gerekiyorsa

, sen CSharpCodeProvider.GetTypeOutput() yerine FullName ait kullanabilirsiniz:

using Microsoft.CSharp; 

[...] 

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

(this question alınan kod parçacığını)

+0

İpucu için teşekkürler, ancak bir CSharpCodeProvider'ın, bunun için, özellikle de sık sık yaparsanız, 'pahalı' değil mi? –

+0

Bunu ölçmedim, ancak bunu çok sık yapmanız gerekiyorsa, bir # Dictionary 'ndaki C# adlarını veya bunun gibi bir şeyi önbelleğe almayı öneririm. İsme ihtiyacınız varsa, sözlüğe bakın. İçinde değilse, yavaş 'GetTypeOutput' yapın ve sözlüğüne kaydedin. –

+1

10.000 denemem 11 ms sürdü. Yani performans bir sorun değil. –

İlgili konular