Следует ли добавлять свойства расширения в C# 4.0?

Я хотел это для плавных интерфейсов. См., Например, обсуждение это Channel9. Вероятно, требовать также добавил бы индексированные свойства.

о чем ты думаешь? Перевесят ли преимущества «языковой беспорядок»?

Нашел интересное сообщение в блоге Эрика Липперта на тему blogs.msdn.com/ericlippert/archive/2009/10/05/…

Jon 10.10.2009 00:53

Не позволяйте этой ссылке доходить до проворных евангелистов, они будут ROTFLOL в лучшем стиле Weird Al. Вы вложили массу усилий в создание функции, и только после того, как она почти ВЫПОЛНЕНА, вы получаете обратную связь от основного потребителя. Угадайте, что произошло?

Francisco Aquino 11.01.2010 20:09

Обновление за август 2020 года: см. Это сообщение SO: stackoverflow.com/questions/619033/… и этот билет: github.com/dotnet/csharplang/issues/192

David Cuccia 24.08.2020 21:47
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
17
3
6 060
13
Перейти к ответу Данный вопрос помечен как решенный

Ответы 13

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

Не знаю почему. Свойства - это просто методы получения / установки с другим синтаксисом.

Я думаю, это было бы здорово, если бы при их использовании не было потери производительности или было бы минимальным.

Определенно добавлю к репертуару инструментов, имеющихся в нашем распоряжении.

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

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

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

Я не думаю, что свойства расширения были бы столь же полезны. Я обнаружил, что в основном использую свойства для инкапсуляции полей (классический get; set;) или для обеспечения качества только для чтения (просто get в закрытом, только для чтения, поле набора конструкторов). Поскольку расширения не могут получить доступ к закрытым членам, я не вижу в этом смысла, особенно для "set;". Чтобы сделать что-нибудь, «установить»; в любом случае придется вызывать другие методы. Затем вы сталкиваетесь с проблемой, когда свойства генерируют исключения.
Поскольку расширения ограничиваются использованием общедоступных свойств и методов, я считаю, что код, использующий служебный класс, чище и легче читается. Когда дело доходит до этого, мы используем методы расширения, чтобы LINQ выглядел красиво. Чтобы разработчики не поступали неправильно, я могу иметь дело с extra () здесь и там в моем LINQ и придерживаться только методов расширения.

Дело в том, чтобы не иметь дело с extra (), как и с любым другим синтаксическим сахаром.

alpav 05.01.2010 22:02

Нет, свойство - это просто способ скрыть то, что действительно было создано для кода. Если вы посмотрите на отраженный код или IL, вы можете определить, что вы действительно получаете, и это следующее:

public string MyProperty { get; set; }

становится

public string get_MyProperty(){ return <some generated variable>; }
public string set_MyProperty(string value) { <some generated variable> = value; }

Это всего лишь 2 метода.

Вы не можете привязать данные к get_MyProperty ()

recursive 05.01.2010 22:26

Я не понимаю этого ответа - вы имеете в виду, что вы тоже не сторонник обычной недвижимости?

David Cuccia 13.01.2010 09:38

нет, я просто указываю, что концепция свойства - это концепция IDE, IL не поддерживает что-то похожее на свойство. Вы можете достичь той же функциональности с помощью get_MyProperty (этот объект o) {...}. Конечно, это не тот синтаксический сахар, к которому мы привыкли, но в целом результат тот же.

Aaron Powell 14.01.2010 10:08

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

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

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

Да, мне он нужен и для привязки данных !!!!

tbone 16.06.2009 01:15

Это не сработает: привязка данных использует отражение типа привязанного объекта для получения свойств. Свойство расширения могло бы существовать в произвольном втором типе, о котором структура привязки не знала бы. Методы расширения (и свойства, если они существуют) - это функция времени компиляции без возможности обнаружения во время выполнения.

Ben M 23.10.2009 03:42

Есть альтернативы этому (я знаю, что опаздываю с ответом, но только что видел этот ответ), используя коллекции, которые реализуют некоторые интерфейсы, связанные с привязкой данных, вы можете добавить в коллекцию дополнительные связываемые свойства. Другими словами, дав рецепт того, как вычислить свойство IsVisible для коллекции, вы можете привязать к ней сетку или что-то подобное. Конечно, если вы хотите выполнить привязку к нему из текстового поля или подобного, вам, вероятно, не повезло.

Lasse V. Karlsen 05.01.2010 22:17
Ответ принят как подходящий

В моей книге № 1 наиболее существенной причиной для свойств расширения является реализация гибких шаблонов интерфейса для кода, не принадлежащего владельцу. Я создал оболочку вокруг сеанса NHibernate, чтобы сделать его более интуитивно понятным для работы, чтобы я мог выполнять логику, аналогичную

public bool IsInTransaction
{
    get { return _session.Is().Not.Null && _session.Is().InTransaction; }
}

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

Разработчикам следует использовать свойства для организации иерархии имен и избегать объединения имен с использованием верблюжьего регистра или подчеркивания. Например, вместо HttpUtility.UrlDecode они должны расширить строковый класс, чтобы использовать что-то вроде "some str" .decode.url В настоящее время единственный способ сделать это в C# - это: "some str" .decode (). Url

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

Да, пожалуйста.

А также добавьте проиндексированные свойства и статические расширения, потому что я СЕРЬЕЗНО хочу этого для System.Console (это не шутка!).

Другие вопросы по теме