如果我想要一个子字符串,我可以做这样的事情:
myString.SubString(0,3);
Run Code Online (Sandbox Code Playgroud)
但是现在代码需要空检查才能安全地调用SubString.所以我写了一个字符串扩展名.
public static string SafeSubString(this string input, int length)
{
if (input == null)
return null;
if (input.Length > length)
return input.Substring(0, length);
return input;
}
Run Code Online (Sandbox Code Playgroud)
现在我可以编写myString.SafeSubString(3);并避免空检查.
我的问题是,是否可以使用带扩展的模板运算符,并以某种方式绕过对象方法中的空检查?
例如.
MyObj.AnyMethod()
Run Code Online (Sandbox Code Playgroud)
也许你可以用T替换字符串
像这附近的东西
static void Swap<T>(this T myObj, delegate method)
{
if(myObj != null)
method.invoke();
}
Run Code Online (Sandbox Code Playgroud)
当然,Use如果你愿意,你可以制作类似方法的东西:
public static TResult Use<TSource, TResult>(
this T obj, Func<TSource, TResult> function)
where T : class
{
return obj == null ? null : function(obj);
}
Run Code Online (Sandbox Code Playgroud)
你也可能想要一个用于void方法的方法:
public static void Use<T>(this T obj, Action<T> action)
where T : class
{
if(obj != null) action(obj);
}
Run Code Online (Sandbox Code Playgroud)
在诸如F#之类的语言中,可以使用monads来允许函数简单地将null传播到它们的结果,而不是抛出异常.在C#中它不是那么漂亮,语法明智.
不过,我对这些方法也有点担心.您基本上是"吞咽"空引用错误.在某些情况下,你可能会这样做,这是一个好的快捷方式,但要小心它,以确保你不要把自己置于一个调试的噩梦中,你无法弄清楚什么是null什么时候不应该.
| 归档时间: |
|
| 查看次数: |
132 次 |
| 最近记录: |