C# では、null オブジェクトで拡張メソッドを呼び出すと何が起こりますか? 質問する

C# では、null オブジェクトで拡張メソッドを呼び出すと何が起こりますか? 質問する

メソッドは null 値で呼び出されますか、それとも null 参照例外が発生しますか?

MyObject myObject = null;
myObject.MyExtensionMethod(); // <-- is this a null reference exception?

この場合、「this」パラメータが null であるかどうかを確認する必要はまったくないのでしょうか?

ベストアンサー1

これは問題なく動作します (例外なし)。拡張メソッドは仮想呼び出しを使用しません (つまり、「callvirt」ではなく「call」il 命令を使用します)。そのため、拡張メソッドで自分で記述しない限り、null チェックは行われません。これは、実際にはいくつかの場合に便利です。

public static bool IsNullOrEmpty(this string value)
{
    return string.IsNullOrEmpty(value);
}
public static void ThrowIfNull<T>(this T obj, string parameterName)
        where T : class
{
    if(obj == null) throw new ArgumentNullException(parameterName);
}

基本的に、静的呼び出しの呼び出しは非常に文字通りです - つまり

string s = ...
if(s.IsNullOrEmpty()) {...}

次のように変わります:

string s = ...
if(YourExtensionClass.IsNullOrEmpty(s)) {...}

明らかに null チェックはありません。

おすすめ記事