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

2 回答 2

5

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

3)如果有固定数量的类型,你需要支持你更好地使用方法重载而不是泛​​型。

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

于 2012-04-13T23:50:54.893 回答
2

是的,类型比较会减慢它的速度,并不是说这样的操作只会显着影响一次所做的任何事情。如果您在某个地方的紧密循环中执行此操作……请考虑执行此操作。这是因为它创建了一个Type对象并比较这些Type对象——它不是编译时检查。

是的,Marshal.SizeOf是正确的1。不过,我不知道 C# 的sizeof作用,因为我是 VB.NET 人员。

至于在 C# 中很少看到这种类型的代码,那可能是因为它不是人们经常遇到的情况。而且,您应该为每种类型提供方法重载,而不是做您正在做的事情;更干净,并且错误发生在编译时,而不是运行时。

1你只是打印出来,打印出来是对的。不过,我不知道这一切的目的是什么。

于 2012-04-13T23:53:39.307 回答