3

これらのメソッドのいずれかを呼び出す利点があるとすれば、それは何か、またその理由を知りたいと思いました。
それらは機能的に同等ですか、それとも常にどちらかを選択する必要がありますか?

4

2 に答える 2

2

私の知る限り、それらは機能的に同等ですが、Assembly.GetAssembly(Type) は core-clr (Silverlight など) では使用できません。

あなたTypeがnullかどうかに基づいて、さまざまなエラーが発生します。 ArgumentNullException をスローするのType.Assemblyに対し、(自然に) NullReferenceException をスローします。Assembly.GetAssembly(Type)コードに基づいて、どちらかを好む場合があります。

編集: ソースを見て、Assembly.GetAssembly:

public static Assembly GetAssembly(Type type)
{
    if (type == null)
        throw new ArgumentNullException("type");
    Contract.EndContractBlock();

    Module m = type.Module;
    if (m == null)
        return null;
    else
        return m.Assembly;
}

一方System.Type.Assembly

public abstract Assembly Assembly {
    get;
}

私が正しく思い出せば、ランタイム型の System.Type は独自のサブクラス (またはそのようなもの) であるため、それぞれがオーバーライドされ、単にアセンブリ参照を直接返す可能性があると思います。それを超えて、あなた次第であるnull処理以外のコードで心配する大きな違いはないと思います。(または、Core-CLR を実行している場合、とにかく Assembly.GetAssembly がない ため、Type.Assembly を使用する必要があります)

于 2012-06-29T14:57:58.893 に答える
0

のドキュメントからType.Assembly

現在のTypeオブジェクトが構築されたジェネリック型を表している場合、このプロパティはジェネリック型の定義を含むアセンブリを返します。

たとえば MyGenerics.dll、ジェネリック型定義を含む という名前のアセンブリを作成するとしますMyGenericStack<T>。別のアセンブリでのインスタンスを作成する MyGenericStack<int>と、構築された型の Assembly プロパティは、以下を表す Assembly オブジェクトを返します。MyGenerics.dll

Assembly.GetAssemblyのドキュメントから:

このメソッドを呼び出すには、Typeオブジェクトが必要です。つまり、クラスが定義されているアセンブリが既に読み込まれている必要があります。

于 2012-06-29T14:58:09.360 に答える