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

Отсутствие ключевого слова 'with' в С#

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

Есть ли в С# ключевое слово или аналогичная конструкция, чтобы имитировать функциональность, предоставляемую ключевым словом С в VB? Если нет, есть ли техническая причина, почему у С# этого нет?

РЕДАКТИРОВАТЬ: Я искал существующую запись на этом, прежде чем задавать свой вопрос, но не нашел тот, на который ссылался луч (здесь). Чтобы уточнить вопрос, существует ли техническая причина, почему у С# этого нет? И Gulzar пригвоздил его - нет, нет технической причины, почему у С# нет ключевого слова С. Это было дизайнерское решение разработчиков языка.

4b9b3361

Ответ 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 и не могу вспомнить, поддерживал ли он его еще. Никогда не ощущала необходимости использовать его.