Off*_*ler 6 c# extension-methods
为什么以下代码有效?
呼叫:
SomeObject sO = null;
bool test = sO.TestNull();
Run Code Online (Sandbox Code Playgroud)
码:
public static bool TestNull(this SomeObject sO)
{
return sO == null;
}
Run Code Online (Sandbox Code Playgroud)
这是允许工作还是只是一个错误?
Jon*_*eet 13
这是允许工作还是只是一个错误?
编辑问题后的代码(打电话s0.TestNull()而不是null.TestNull()打算工作,是的.
扩展方法只是用于调用静态方法的语法糖,就好像它们是实例方法一样.所以打电话给:
s0.TestNull()
Run Code Online (Sandbox Code Playgroud)
转换成
ClassContainingExtensionMethod.TestNull(s0)
Run Code Online (Sandbox Code Playgroud)
... 就这样.不会自动执行无效检查.
这实际上可能非常有用 - 想象一下是否string.IsNullOrEmpty是一个扩展方法 - 然后而不是写:
if (string.IsNullOrEmpty(foo))
Run Code Online (Sandbox Code Playgroud)
你可以写得更可读:
if (foo.IsNullOrEmpty())
Run Code Online (Sandbox Code Playgroud)
但是,不应该掉以轻心 - 大多数扩展方法应该抛出ArgumentNullException第一个参数的空值,而不应该非常清楚.(这种方法不应该包含Null在名称的某处,这应该是相对罕见的.)
假设你的意思
bool test = sO.TestNull();
Run Code Online (Sandbox Code Playgroud)
那么答案就是静态函数不需要对象的实例.此外,调用扩展函数只是用于使用参数调用函数的语法糖.
编辑:
我还建议你阅读Jon Skeet的回答.
| 归档时间: |
|
| 查看次数: |
200 次 |
| 最近记录: |