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

Метод Partial Class vs Extension

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

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

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

4b9b3361

Ответ 1

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

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

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

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

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

Ответ 2

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

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

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

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

Ответ 3

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

Ответ 4

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

Методы расширения - это только статические методы и не могут обращаться к закрытым членам.

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

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

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

Ответ 5

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

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

Ответ 6

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

Ответ 7

Если вы выбираете маршрут 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..

Ответ 8

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

Ответ 9

Partial Class - 

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

Extension Method  

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