这怎么可行(静态扩展?)

Ten*_*lla 4 c#

我在Marc Gravell的回答中看到了这一点,我只是看不出它是如何起作用的

static bool IsNullOrEmpty(this string value)
{    
    return string.IsNullOrEmpty(value);
}
Run Code Online (Sandbox Code Playgroud)

不应该调用s.IsNullOrEmpty(),其中s为null,然后返回NullReferenceException?如果对象为null,如何取消引用该对象以调用此处定义的函数?

或者这是一种结束猴子修补静态功能的方法吗?

Mar*_*ell 12

扩展方法很神奇 - 它们看起来只是实例方法,但是给出了扩展方法:

public static class StaticClass {
    public static void MyMethod(this SomeType obj) // note "this"
    {...}
}
Run Code Online (Sandbox Code Playgroud)

然后:

instance.MyMethod();
Run Code Online (Sandbox Code Playgroud)

编译为:

StaticClass.MyMethod(instance);
Run Code Online (Sandbox Code Playgroud)

并且你不会指望抛出NullReferenceException- 而事实上并非如此.

这是双刃剑.在某些层面上它令人困惑,但它确实很有用.除非您有理由允许空值,否则最好在开始时添加自己的null-ref检查.另一个有用的:

public static void ThrowIfNull<T>(T value, string name) where T : class {
    if(value==null) throw new ArgumentNullException(name);
}
...
void SomeUnrelatedMethod(string arg) {
    arg.ThrowIfNull("arg");
}
Run Code Online (Sandbox Code Playgroud)