2012-04-13 97 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)等等。如果存在“一般情况”来支持其他任何事情,那么除了这些方法之外,还可以使用通用方法。