如何在C#中返回Empty值而不是null

时间:2011-07-04 23:25:38

标签: c# string generics

我有一个字符串数组的扩展名,如果数组为null,则返回一个空字符串;如果数组长度为== 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。所以我现在为Strings返回空值,这是第一个要求......

是否存在可以返回空泛型值而不是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];
}

两种不同的方法,一种用于String,另一种用于其余方法。

6 个答案:

答案 0 :(得分:3)

对于引用类型,除了null之外没有通用默认值,对于值类型

,没有0的一些变体

您可以轻松提供一个

public static T IndexOrDefault<T>(this T[] arr, Int32 index, T theDefaultValue)
{
    if (arr == null)
        return theDefaultValue;
    return arr.Length == 1 ? arr[0] : arr[index];
}

public static T IndexOrDefault<T>(this T[] arr, Int32 index, Func<T> defaultFactory)
{
    if (arr == null)
        return defaultFactory();
    return arr.Length == 1 ? arr[0] : arr[index];
}

答案 1 :(得分:1)

  

或第一个元素,如果数组在索引位置没有元素

不完全。如果数组的长度为1,则该方法返回第一个元素,但它根本不检查索引。你所描述的内容宁愿是这样的:

public static Strings IndexOrDefault(this String[] arr, Int32 index) {
  if (arr == null || arr.Length == 0) return String.Empty;
  if (index >= arr.Length) return arr[0];
  return arr[index];
}

通用版本将是:

public static T IndexOrDefault<T>(this T[] arr, Int32 index) {
  if (arr == null || arr.Length == 0) return default(T);
  if (index >= arr.Length) return arr[0];
  return arr[index];
}
  

是否存在可以返回空泛型值而不是null的默认替换?

不,没有办法为泛型类型获取空值。大多数类型根本没有任何空值。例如,int不能为空。

答案 2 :(得分:0)

不,nullstring的默认值。您需要添加专门针对T是字符串进行测试的代码,或者使用不同的方法。

答案 3 :(得分:0)

您可以尝试返回new T() - 但是您需要在方法声明中添加where T : new约束。

否则,string的默认值为null。所以下一个选项是创建一个字符串重载......我知道它不是最好的选择,但你可以用它来管理。

答案 4 :(得分:0)

您可以检查“特殊”类型string。此外,您的代码没有按照您所说的那样做 - 为您修复了一些边缘条件:

public static T IndexOrDefault<T>(this T[] arr, Int32 index)
{
    if (arr == null || arr.Length == 0)
        return default(T);

    return arr.Length <= index ? arr[0] : arr[index];
}

答案 5 :(得分:0)

当您返回T的默认值时会发生什么?