Частичный класс против метода расширения - PullRequest
38 голосов
/ 16 мая 2011

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

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

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

Ответы [ 9 ]

37 голосов
/ 16 мая 2011

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

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

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

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

  • Может применяться против классов в других сборках
  • Должен быть статичным, иметь доступ только к публичным элементам классов Target
  • Целью расширения может быть конкретный тип, абстрактный тип или интерфейс
24 голосов
/ 16 мая 2011

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

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

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

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

3 голосов
/ 20 сентября 2012

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

2 голосов
/ 16 мая 2011

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

2 голосов
/ 16 мая 2011

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

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

2 голосов
/ 16 мая 2011

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

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

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

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

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

1 голос
/ 16 февраля 2012

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

Например, у меня есть много сгенерированных классов с методами, которые возвращают данные 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..
0 голосов
/ 16 мая 2011
Partial Class - 

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

Extension Method  

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

0 голосов
/ 16 мая 2011

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

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