我在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)