1. ホーム
  2. c#

[解決済み】C#で、Nullオブジェクトに対して拡張メソッドを呼び出すとどうなるか?

2022-03-25 18:15:05

質問

メソッドはNULL値で呼び出されるのか、それともNULL参照例外を発生させるのか?

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

この場合、「this」パラメータがNULLであるかどうかをチェックする必要はないのでしょうか?

どのように解決するのですか?

それで問題なく動作します(例外はありません)。拡張メソッドは仮想コールを使わないので(つまり "call" il 命令を使うのであって "callvirt" は使わない)、拡張メソッドの中に自分で書かない限り 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チェックはありません。