これらのメソッドのいずれかを呼び出す利点があるとすれば、それは何か、またその理由を知りたいと思いました。
それらは機能的に同等ですか、それとも常にどちらかを選択する必要がありますか?
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 を使用する必要があります)
現在の
Type
オブジェクトが構築されたジェネリック型を表している場合、このプロパティはジェネリック型の定義を含むアセンブリを返します。たとえば
MyGenerics.dll
、ジェネリック型定義を含む という名前のアセンブリを作成するとしますMyGenericStack<T>
。別のアセンブリでのインスタンスを作成するMyGenericStack<int>
と、構築された型の Assembly プロパティは、以下を表す Assembly オブジェクトを返します。MyGenerics.dll
Assembly.GetAssemblyのドキュメントから:
このメソッドを呼び出すには、
Type
オブジェクトが必要です。つまり、クラスが定義されているアセンブリが既に読み込まれている必要があります。