泛型中的动态类型

时间:2012-04-13 23:45:04

标签: c# generics

我目前正在研究C#Generics,我有几个问题。

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");
            }
        }
    }
}

2 个答案:

答案 0 :(得分:5)

1)它将在运行时完成,而不是在编译时完成。这不是C ++模板。也就是说,这是一个非常快速的操作。

3)如果有一些固定数量的类型需要支持你使用方法重载比使用泛型更好。

对于您需要支持的每种类型,请Test(int input)Test(string input)等。除了支持其他所有内容的“一般情况”之外,您还可以使用通用方法。

答案 1 :(得分:2)

是的,类型比较会降低速度,而不是这样的操作会显着影响只执行一次的任何操作。如果你在某个地方紧紧地做这个......考虑这样做。这是因为它创建了一个Type对象并比较了那些Type对象 - 它不是编译时检查。

是的,Marshal.SizeOf是正确的 1 。我不知道C#的sizeof是做什么的,因为我是VB.NET的人。

至于在C#中没有看到这种类型的代码,这可能是因为它不是人们经常遇到的情况。 而且,你应该为每种类型提供方法重载,而不是做你正在做的事情;更清洁,错误是在编译时,而不是运行时。

1 您只是将其打印出来,将其打印出来是正确的。不过,我不知道这一切的目标是什么。