Подтвердить что ты не робот

Resharper предполагает, что параметр может иметь тип "BaseType"

Каковы преимущества использования базовых типов в параметрах метода?

Здесь один образец:


private void Foo(List<int> numbers) //R# laments: parameter can be IEnumerable. 
{
    foreach (var i in numbers) {
        Console.WriteLine(i);
    }
}



И здесь другой


public class Foo : ICloneable
{
    public object Clone()
    {
        return MemberwiseClone();
    }

    public Foo CopyMe(Foo other) //R# laments: parameter can be ICloneable
    { 
        return (Foo)other.Clone();
    }
}

... где we может изменить тип, и все, кроме Foo, выйдет из строя во время выполнения.



Итак, вопрос: что мне делать, когда R # предлагает параметр может иметь тип "X" ?




PS. Еще одно объяснение для Whysharper - плагин, который согласуется с Resharper и StackOverflow. Люди говорят это хорошо, но не имеют хороших объяснений - надеюсь, вместе мы сможем сделать это лучше;).

4b9b3361

Ответ 1

Использование базовых типов параметров имеет следующие преимущества:

  • Уменьшает ненужную связь в коде
  • Делает ваш код более гибким, позволяя более широкий диапазон допустимых входов
  • Обеспечивает безопасность вашего кода, ограничивая типы операций, которые могут выполняться на входе
  • Повышает производительность вашего кода за счет уменьшения необходимости выполнять преобразования между типами

Однако вы не всегда должны использовать базовый тип в вызове метода только потому, что такой инструмент, как ReSharper, говорит, что это возможно. Вы должны убедиться, что использование и семантика методов ясны - и что будущие изменения вряд ли потребуют перемещения по иерархии наследования - потенциально нарушение существующего кода.

В приведенных выше примерах использование IEnumerable вместо списка позволяет вызывающим вашим кодом передавать не только объекты List, но также массивы, стеки, очереди и даже результаты вызовов LINQ (которые в первую очередь возвращают IEnumerable). Поскольку ваш код выполняет только итерацию по коллекции, ему не нужно знать о List. Это также означает, что потребителям вашего кода не придется конвертировать свои коллекции в копии типа List, чтобы передать их вашему методу.