Частичный класс против метода расширения

У меня нет большого опыта использования этих двух способов расширения класса или создания методов расширения для класса. Посмотрев другие работы, у меня возник вопрос.

Я видел людей, использующих разделяемый класс для расширения класса сущностей в проекте. Между тем, в том же проекте есть еще одна папка, содержащая множество методов расширения класса сущности.

Правильно ли это сделать? Я имею в виду, что эти 2 способа работают хорошо. Не могли бы вы дать мне реальное представление о том, как выбрать один или другой, когда я хочу расширить класс?


person ValidfroM    schedule 16.05.2011    source источник
comment
@Cody Grey Вы имеете в виду шаблон проектирования или языковую функцию в С#.   -  person ValidfroM    schedule 16.05.2011
comment
Это шаблон дизайна. Композиция не является языковой функцией C# или любого другого известного мне языка.   -  person Cody Gray    schedule 16.05.2011
comment
Комментарий Коди Грея является чистым догматическим утверждением, которое не аргументировано и не может быть аргументировано. Частичные классы/методы и методы расширения служат разным целям и открывают совершенно разные возможности. Композиция не имеет к этому никакого отношения и является третьей концепцией со своими плюсами и минусами.   -  person Ssithra    schedule 25.05.2011


Ответы (9)


Некоторые из различий, которые будут определять, хотите ли вы использовать частичный класс или метод расширения:

Частичный класс

  • Работает только с классами в том же проекте/сборке
  • Целевой класс должен быть помечен как частичный
  • Имеет доступ к полям и защищенным членам целевого класса.
  • Цель должна быть реализацией класса

Метод расширения

  • Может применяться против классов в других сборках
  • Должен быть статическим, имеет доступ только к публичным членам целевых классов.
  • Целью расширения может быть конкретный тип, абстрактный тип или интерфейс.
person Jaimal Chohan    schedule 16.05.2011
comment
Кроме того: методы, представленные через разделяемый класс, отображаются в intellisense, но с методами расширения кодер должен знать об этом. VS может помочь вам включить пространство имен, но вам все равно нужно знать имя метода. Кто-то, кто не знаком с методами расширения, может даже не знать, что они существуют. (у меня часто возникают проблемы с запоминанием собственных методов расширения, поэтому я решил преобразовать некоторые из них в частичные классы). - person Etherman; 15.12.2019

Частичные классы следует использовать в сценариях генерации кода.

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

Кроме того, частичные элементы будут работать только в том случае, если они являются частью одной сборки — они не могут пересекать границы сборки.

Если это не ваши ограничения, вы можете и должны использовать методы расширения — конечно, после рассмотрения других возможностей, таких как наследование и композиция для пригодности.

person Oded    schedule 16.05.2011
comment
Идеально подходит для моделей данных ADO.net, ориентированных на базы данных. - person William T. Mallard; 02.04.2016

Вы можете использовать методы расширения для экземпляра NULL, но не методы экземпляра (частичных классов или иным образом). Это следствие того, что методы расширения на самом деле являются статическими.

person Ron Newcomb    schedule 20.09.2012

Я использую частичные методы, когда мне нужен класс для реализации интерфейса, но код класса генерируется автоматически (VS использует частичные классы для создания кода как для веб-служб, так и для моделей EF).

Я использую методы расширения, когда новый метод, который я добавляю к типу, подходит для любого значения этого типа. (хорошие примеры: int.IsEven(), string.IsEmpty(); плохие примеры: int.IsOldEnoughToDrive(), string.IsLastName()).

person lance    schedule 16.05.2011
comment
хорошие методы расширения не имеют отношения к бизнес-логике, не так ли? - person ValidfroM; 17.05.2011
comment
Как правило, да. Придерживаясь правила о релевантности метода расширения для любого значения данного типа, вы отфильтровываете большую часть своих возможностей иметь бизнес-логику в методе расширения. - person lance; 17.05.2011

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

person Marco    schedule 16.05.2011

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

Методы расширения являются просто статическими методами и не могут получить доступ к закрытым членам.

Итак, если вы хотите получить доступ к закрытым и защищенным членам, единственный способ, который у вас есть, является частичным, если нет, ответьте на вопрос, должен ли метод, который вы хотите добавить, быть видимым везде, где вы хотите использовать класс? если да, используйте частичное, если нет, то какое-то расширение, используйте методы расширения.

Кстати, если первый класс не сгенерирован каким-то инструментом, вы можете написать свою функцию там, кроме использования partial ;)

надеюсь это поможет

person Arsen Mkrtchyan    schedule 16.05.2011

Если вы выберете маршрут частичного класса, но обнаружите, что повторяете один и тот же код, переключитесь на методы расширения.

Например, у меня есть много сгенерированных классов с методами, которые возвращают IEnumerable<Track> данных. Я хочу как-то расширить каждый класс, чтобы дать мне возможность получать данные в формате IEnumerable<MediaItem>.

У меня есть общее требование преобразовать данные IEnumerable<Track> в IEnumerable<MediaItem>. В этом случае вместо написания нескольких методов partial class лучше всего работает метод расширения:

public static class ExtensionMethods
{
    public static IEnumerable<MediaItem> ToMediaItems(this IEnumerable<Track> tracks)
    {
        return from t in tracks
               select new MediaItem
               {
                   artist = t.Artist,
                   title = t.Title,
                   // blah blah
               };
    }
}

Это дает мне следующие варианты:

var data = Playlist.Tracks.ToMediaItems();
var data = Podcast.Tracks.ToMediaItems();
// etc..
person Lloyd    schedule 16.02.2012

Частичный класс полезен, когда вы хотите расширить сгенерированный класс. Таким образом, вы можете написать свой код в одном файле, а затем, когда/если потребуется повторно сгенерировать другую «часть» вашего класса, это можно сделать безопасно, поскольку этот файл кода не изменился.

person Paddy    schedule 16.05.2011
comment
но этот аргумент применим и к методам расширения - person Lloyd; 16.02.2012

Partial Class - 

разделить определение класса или структуры или интерфейса на два или более исходных файла

Extension Method  

Методы расширения позволяют «добавлять» методы к существующим типам без создания нового производного типа, перекомпиляции или иного изменения исходного типа.

person anishMarokey    schedule 16.05.2011