您是否可以使用带扩展方法的模板来破坏C#中的空检查?

时间:2013-11-19 17:18:54

标签: c#

如果我想要一个子字符串,我可以这样做:

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(); 
}

1 个答案:

答案 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什么时候不应该。