Отсутствие ключевого слова 'with' в С#
Я смотрел онлайн-справку для библиотеки управления Infragistics сегодня и увидел некоторый код VB, который использовал ключевое слово С, чтобы установить несколько свойств в элементе управления вкладкой. Прошло почти 10 лет с тех пор, как я сделал какое-либо программирование на VB, и я почти забыл, что это ключевое слово даже существует. Поскольку я до сих пор относительно новичок в С#, я быстро пошел посмотреть, была ли у него аналогичная конструкция. К сожалению, я ничего не смог найти.
Есть ли в С# ключевое слово или аналогичная конструкция, чтобы имитировать функциональность, предоставляемую ключевым словом С в VB? Если нет, есть ли техническая причина, почему у С# этого нет?
РЕДАКТИРОВАТЬ: Я искал существующую запись на этом, прежде чем задавать свой вопрос, но не нашел тот, на который ссылался луч (здесь). Чтобы уточнить вопрос, существует ли техническая причина, почему у С# этого нет? И Gulzar пригвоздил его - нет, нет технической причины, почему у С# нет ключевого слова С. Это было дизайнерское решение разработчиков языка.
Ответы
Ответ 1
Это то, что должен сказать менеджер программ на С#:
Почему С# не имеет инструкции 'with'?
-
Небольшие или несуществующие преимущества чтения. Мы думали, что преимущества чтения были небольшими или вообще не существовали. Я не пойду так далеко, чтобы сказать, что оператор with делает код менее читаемым, но некоторые люди, вероятно, будут.
-
Повышенная сложность языка. Добавление инструкции with сделает язык более сложным. Например, VB должен был добавить новый синтаксис языка, чтобы устранить потенциальную двусмысленность между локальной переменной (Text) и свойством "with" target (.Text). Другие способы решения этой проблемы также включают сложность языка. Другой подход заключается в том, чтобы надавить область и заставить свойство скрывать локальную переменную, но тогда нет способа ссылаться на локальный, не добавляя некоторый синтаксис escape.
-
Наследие С++. У С++ никогда не было оператора with, и отсутствие такого утверждения обычно не рассматривается разработчиками С++. Кроме того, мы не чувствовали, что другие изменения - изменения в типах людей, которые пишут, изменения в платформе, другие изменения в языке и т.д. - сделаны с более необходимыми заявлениями.
Ответ 2
В С# 3.0 вы можете использовать инициализаторы объектов для достижения аналогичного эффекта при создании объектов.
var control = new MyControl
{
Title = "title",
SomeEvent += handler,
SomeProperty = foo,
Another = bar
};
Вместо
var control = new MyControl();
control.Title = "title";
control.SomeEvent += handler;
control.SomeProperty = foo;
control.Another = bar;
Обратите внимание, что хотя этот синтаксис был введен в С# 3.0, вы все равно можете использовать его со структурой 2.0, это просто синтаксический сахар, введенный компилятором.
Ответ 3
Это не идиоматический С#, но если вы действительно хотите эквивалент with
, вы можете сделать это:
Person MyPersonWithALongName = new Person();
MyUtils.With(MyPersonWithALongName, p => {
p.Name = "George";
p.Address = "123 Main St";
...
});
class MyUtils {
public static void With<T>(T x, Action<T> do) {
do(x);
}
}
Update:
Мне пришло в голову, что вы можете сделать это более кратким, превратив его в метод расширения, возможно, переименовав его в "Alias" или "As" для удобства использования:
MyPersonWithALongName.Alias(p => {
p.Name = "George";
p.Address = "123 Main St";
...
});
Ответ 4
Нет, ключевое слово "с" умышленно было исключено из языка.
Если у вас длинное имя ссылки, вы можете легко сделать более короткую ссылку на нее с помощью переменной и даже дать ей ограниченную область действия:
{
SomeClass r = Some.Lengthy.Path.To.Get.To.A.Referece;
r.Some = 42;
r.Properites = "none";
r.To = 1;
r.Set = null;
}
Ответ 5
Для этих решений:
// ....
// (class Common)
public static void With<T>(T property, Action<T> action) {
action(property);
}
// ...
// usage somewhere ...
Person person = GetPerson();
Common.With(person, p => { p.Name = "test", p.Age = "123" });
Кажется, мы сглаживаем переменную с "p". По мере того как решения идут, я нашел достаточно легким, чтобы сохранить имя переменной коротким, такое решение с "С" общим не покупает никакой элегантности.
В идеале нам бы хотелось увидеть некоторую переработку синтаксиса, поэтому использование похоже на то, как сегодня выполняется инициализация нескольких свойств:
Person person = new Person() { Name = "test", Age = "123" };
Ответ 6
Нет, это было сознательное решение, принятое командой С# dev. У людей смешанные чувства относительно ключевого слова "с", потому что он может ухудшить читаемость кода, если он злоупотребляет (вложенность с).
Ответ 7
Я не думаю, что существует техническая причина, которой она не существует. Однако я бы сказал, что причина, по которой он не существует, заключается в том, что он представляет собой конструкцию программирования, которая существует исключительно с целью сокращения ввода. С такими вещами, как intellisense, и копирование и вставка, мир действительно не имеет большого спроса на такие функции больше. Я использую VB.Net и не могу вспомнить, поддерживал ли он его еще. Никогда не ощущала необходимости использовать его.