我有一个字符串数组的扩展,如果数组为空,则返回空字符串,如果数组长度等于1,则返回第一个元素,否则返回索引位置的元素,没有边界检查。
public static Strings IndexOrDefault(this String[] arr, Int32 index)
{
if (arr == null)
return String.Empty;
return arr.Length == 1 ? arr[0] : arr[index];
}
现在,我需要将这个功能扩展到其他数组上,因此我想这个扩展方法可以胜任。
public static T IndexOrDefault<T>(this T[] arr, Int32 index)
{
if (arr == null)
return default(T);
return arr.Length == 1 ? arr[0] : arr[index];
}
除了默认值(default(String))不是String.Empty而是null之外,一切都很好。因此,现在我为字符串返回null,这是第一个要求...是否有替代default的方法可以返回空的通用值而不是null?
编辑2:(第一个是定义)
现在我正在使用这种方法,它有效,但不像我想要的那样优雅(好吧,方法也不太优雅,但解决方案可能会更好:))
public static T IndexOrDefault<T>(this T[] arr, Int32 index)
{
if (arr == null)
return default(T);
return arr.Length == 1 ? arr[0] : arr[index];
}
public static String IndexOrDefault(this String[] arr, Int32 index)
{
if (arr == null)
return String.Empty;
return arr.Length == 1 ? arr[0] : arr[index];
}
有两种不同的方法,一种适用于字符串,另一种是通用的。
WhateverOrDefault
的方法中返回任何不是null
的引用类型将会令人困惑、不直观,而且实际上是个谎言。你的方法说了一件事,但你却做了另一件事。null
是string
的默认值,而不是String.Empty
。此外,如果长度为1
,为什么要通过返回array[0]
来吞噬错误?如果调用者传递了无效的索引,那么他们应该知道这一点,而不是花时间(可能)试图找到隐藏的错误。 - Ed S.