Должен ли объект ввода быть клонирован, если это возвращаемое значение? - PullRequest
0 голосов
/ 14 мая 2019

, когда у вас есть метод, такой как

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 ]

2 голосов
/ 14 мая 2019

Поскольку подпись вашего метода такова:

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

Будет работать на месте.

0 голосов
/ 14 мая 2019

Это мое мнение относительно новых примеров:

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
}
0 голосов
/ 14 мая 2019

Массив нулевой длины является неизменным, поэтому его можно безопасно вернуть без клонирования.

Чтобы удалить элемент из непустого массива, в любом случае его необходимо клонировать, поскольку длина массива не может бытьизменилось.

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();
   }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...