Вопрос по c#, vb.net – Эквивалентность «С… Конец С» в C #? [Дубликат]

18

This question already has an answer here:

With block equivalent in C#? 15 answers

Я знаю, что C # имеетusing ключевое слово, ноusing избавляется от объекта автоматически.

Есть ли эквивалентностьWith...End With вVisual Basic 6.0?

& Quot; с & Quot; на самом деле существовал задолго до VB. Он существует в Pascal для работы с типами записей. Не знаю, заимствовал ли Паскаль эту идею откуда-то еще. JeffK

Ваш Ответ

6   ответов
32

Это не эквивалентно, но сработает ли этот синтаксис для вас?

Animal a = new Animal()
{
    SpeciesName = "Lion",
    IsHairy = true,
    NumberOfLegs = 4
};
& Quot; С & Quot; не создает экземпляры, так что это неправильно.
5

Нет эквивалента With ... End With inC #.

Здесь & APOS; sсравнительная таблица для вас это иллюстрирует различия между Visual Basic и C #.

Эта сравнительная таблица потрясающая. Я работаю над переходом на C # из VB, и это будет очень полезно.
7

Я думаю, что эквивалент следующегоVB:

With SomeObjectExpression()
  .SomeProperty = 5
  .SomeOtherProperty = "Hello"
End With

Было бы этоC#:

{
  Var q=SomeOtherExpression();
  q.SomeProperty = 5;
  q.SomeOtherProperty = "Hello";
}

Единственное реальное отличие состоит в том, что в vb идентификатор не имеет имени "q", а является просто идентификатором по умолчанию, используемым, когда период встречается без какого-либо другого идентификатора перед ним.

@JohnStock: Когда я говорю «эквивалент», я говорю о поведении. Не важно чтоSomeOtherExpression или установщики свойств, я не думаю, что какой-либо из них мог бы определить, какой из приведенных выше фрагментов кода оценивал ихexcept используя Reflection для изучения контекста вызова. Тот факт, что Reflection может различать вызывающий контекст, делает их неquite эквивалентно, но во всех других отношениях поведение будет идентичным.
Это не эквивалент, это альтернатива.
Что с внешними завитками? Извините, но это никоим образом не близко к эквиваленту. Это просто куча обращений к сеттерам.
Внешние скобки устанавливают область видимости переменной q. При условии, что объектное выражение является классом, а не структурой, я думаю, что код VB.Net и C # выше почти точно эквивалентны. Первый оператор является примером того, как можно использовать оператор with, а второй - перевод на C #. Пример C # использует пару установщиков, потому что это то, что делает произвольно выбранный пример VB.net. Существенным моментом является то, что «с» эквивалентно определению временной переменной и последующему ее использованию в любое время, когда используется период без предшествующего идентификатора.
2

В C # нет эквивалентной структуры. Это Visual Basic 6.0 /VB.NET особенность.

15

но я думаю, что обсуждение синтаксиса может быть интересным!

Мне очень нравится;

NameSpace.MyObject.
{
    active = true;
    bgcol = Color.Red;
}

Любые другие предложения?

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

EDIT:

Мне надоело ждать эту функцию, поэтому вот и расширение, которое достигает аналогичного поведения.

/// <summary>
/// C# implementation of Visual Basics With statement
/// </summary>
public static void With<T>(this T _object, Action<T> _action)
{
    _action(_object);
}

Использование;

LongInstanceOfPersonVariableName.With(x => {
     x.AgeIntVar = 21;
     x.NameStrVar = "John";
     x.NameStrVar += " Smith";
     //etc..
});

EDIT: Интересно, что кто-то снова избил меня этим ударом с помощью этого «решения». Ну что ж..

Error: User Rate Limit Exceeded
Error: User Rate Limit Exceededx = LongInstanceOfPersonVariableName; x.AgeIntVar = 21; //etc.
Error: User Rate Limit Exceeded
30

это правда. Но если у вас есть класс с методами, которые возвращают «this», то вы можете объединить методы в цепочку.

Похожие вопросы