0

私は現在、C# Generics を調べていますが、いくつか質問があります。

1) 次のコードでは、「テスト」で 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正しいです1sizeofただし、私は VB.NET を使用しているため、C# が何をするのかはわかりません。

このタイプのコードが C# であまり見られないのは、おそらく、人々が頻繁に遭遇するケースではないためです。また、現在行っていることを行う代わりに、型ごとにメソッドのオーバーロードを提供する必要があります。エラーは実行時ではなくコンパイル時に発生します。

1印刷するだけです。印刷するのが正しいです。しかし、これらすべての目的が何であるかはわかりません。

于 2012-04-13T23:53:39.307 に答える