2012-04-13 93 views
0

我目前正在研究C#泛型,我有幾個問題。在泛型中的動態類型

1)在下面的代碼中,「Test」中T的類型比較會減慢程序的運行速度嗎?在其他語言中,這是在編譯時處理的,但我不瞭解C#。

2)由於sizeof顯然不會工作,我不得不使用System.Runtime.InteropServices.Marshal.SizeOf。它是否正確? 3)我還沒有在C#中看到類似這樣的代碼,但是有什麼不對嗎,或者我在這裏做的事情是完全正確的嗎?最後,這個例子中的方法會帶來一些類型,如果它無法處理它,則拋出異常。一些類型將被獨立處理,其他像short/int/long一起被處理,這取決於它們的大小。

using System; 

namespace ConsoleApplication1 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      Test<int>(); 
      Test<long>(); 
      Test<string>(); 
      Console.ReadLine(); 
     } 

     static void Test<T>() 
     { 
      Type type = typeof(T); 

      if (type == typeof(int) || type == typeof(long)) 
      { 
       Console.WriteLine("int"); 
       Console.WriteLine(System.Runtime.InteropServices.Marshal.SizeOf(type).ToString()); 
      } 
      else if (type == typeof(string)) 
      { 
       Console.WriteLine("string"); 
      } 
     } 
    } 
} 
+0

1)你可以用計時器運行它並檢查。 2)你有沒有試過sizeof?這對我來說可以。 3)你擁有它的方式很好(只要在例外的末尾添加最後一個elseif)。雖然我會用switch()來做。與C++不同,switch語句可以比較多的int /枚舉。 – 2012-04-13 23:49:57

回答

2

是的,類型比較會降低速度,而不是這樣的操作會顯着影響只做一次的任何操作。如果你在一個緊密的循環中做某事...考慮而不是這樣做。這是因爲它會創建一個Type對象並比較這些對象 - 這不是編譯時檢查。

是的,Marshal.SizeOf是正確的。我不知道C#的sizeof做什麼,但是,因爲我是一個VB.NET的人。

至於在C#中沒有看到這種類型的代碼,這可能是因爲它不是人們經常碰到的情況。 此外,您應該爲每種類型提供方法過載而不是您正在做的事情;更清潔,錯誤是在編譯時,而不是運行時。

您只是將其打印出來,打印出來是正確的。不過,我不知道這一切的目標是什麼。

+0

'sizeof(Type)'返回某個類型的大小,這看起來正是OP想要的大小。我不知道爲什麼它不適合他。在任何情況下,'Marshal.SizeOf'都是這樣做的'OO'方式(好''''''''OO')* note *:我是一個C#(和Java)人8D – 2012-04-13 23:55:47

+2

'sizeof(Type)'返回託管結構的大小。 Marshal.SizeOf()返回封送後結果的非託管結構的大小。這兩個並不總是相同的大小。 (例如'sizeof(char)= 2',但是Marshal.SizeOf(typeof(char))= 1') – Daniel 2012-04-14 01:37:46

5

1)它將在運行時完成,而不是編譯時完成。這不是C++模板。這就是說,這是一個相當快的操作。

3)如果有一個固定數量的類型需要使用方法重載比泛型支持更好。

對於您需要支持的每種類型,都有Test(int input),Test(string input)等等。如果存在「一般情況」來支持其他任何事情,那麼除了這些方法之外,還可以使用通用方法。