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