如果输入对象是返回值,是否应该克隆它?

时间:2019-05-14 17:31:50

标签: c# clone return-value

使用

之类的方法时
public static T[] GetZeroArrayIfNot<T>(this T[] array)
{
   if (array == null)
   {
     throw new ArgumentNullException("array");
   }
   else if (array.Length == 0)
   {
       return //array or (array.Clone() as T[])?
   }
   return new T[0];
}

或类似的东西

public static int HundredOrLess(int num)
{
    if (num <= 100)
    {
        return //num or ((int num2 = num) => (return num2)) doubt this one matters.
    }
    return 100;
}

public static List<T> ReturnItself<T>(List<T> list)
{
   return //list or (list.Clone() as List<T>);
}

如果要返回输入,则什么都不会改变,可以按原样返回,还是应该将其克隆并作为返回类型返回?

3 个答案:

答案 0 :(得分:2)

由于您的方法签名是这样的:

public static T[] RemoveFirstElement<T>(this T[] array)

我认为这将始终返回一个 new 数组。因为您总是需要写:

var myArray = SomeArray.RemoveFirstElement();

您不希望myArray现在指向与SomeArray完全相同的对象。如果您希望它始终在现有数组上运行,则方法签名为:

public static void RemoveFirstElement<T>(this T[] array)

这样写:

var myArray = SomeArray.RemoveFirstElement();

将导致编译时错误。很明显,看到:

SomeArray.RemoveFirstElement();

将就地操作。

答案 1 :(得分:0)

长度为零的数组是不可变的,因此可以安全地返回它而无需克隆。

要从非空数组中删除元素,无论如何都需要将其克隆,因为数组的长度无法更改。

public static T[] RemoveFirstElement<T>(this T[] array)
{
   if (array == null)
   {
     throw new ArgumentNullException(nameof(array));
   }
   else if (array.Length == 0)
   {
       return array;
   }
   else
   {
       return array.Skip(1).ToArray();
   }
}

答案 2 :(得分:0)

这是我对新示例的看法:

public static T[] GetZeroArrayIfNot<T>(this T[] array)
{
    if (array == null)
    {
        throw new ArgumentNullException("array");
    }
    else if (array.Length == 0)
    {
        return array;
        // because the name of the method implies that a zero-length array
        // should be treated differently than a non-zero-length array
    }
    return new T[0];
}

public static int HundredOrLess(int num)
{
    if (num <= 100)
    {
        return num;
        // It doesn't matter. The caller is not affected either way
        // because num is an immutable value type passed by value
    }
    return 100;
}

public static List<T> ReturnItself<T>(List<T> list)
{
    return list; // Because the method name says so
}