2013-03-22 2 views
5

Только что узналЛокальная переменная может быть названа выходом

foreach (int yield in items) { 
    yield return yield * 2; 
} 

или

int yield = 10; 

действительны коды в C#.

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

Знаем ли мы точные причины, по которым это разрешено?

+0

Я считаю, что все по-другому. Во-первых, устанавливаются правила по именам переменных, затем некоторые ключевые слова запрещены к использованию. Таким образом, не должно быть никаких оснований позволять что-то. Знаете ли вы какую-либо вескую причину, чтобы отклонить «yield» как имя переменной? –

ответ

18

Знаем ли мы точные причины, по которым это разрешено?

Да. Зарегистрироваться Логин yield только для текста ключевое слово:. Он был введен в C# 2, и команда не захотела сломать код, который уже использовал yield в качестве идентификатора.

То же самое касается других контекстуальных ключевых слов, которые были введены с 1.0, например partial. См. Eric Lippert's blog post для получения полного списка.

, но все же добавляет путаницы и уменьшить читаемость кода

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

private int _; 
private string __; 
// etc 

Вы делаете это? Если нет, то почему вы ожидаете, что люди напишут путаный код с yield?

+0

@ DanielHilgarth: Уже добавлял - но забыл присоединиться! –

+0

Чтобы сохранить обратную совместимость, рассмотрим ли список ключевых слов в C# как закрытый? – NileshChauhan

+0

Совсем нет. Некоторые ключевые слова должны быть сделаны неконтекстно, чтобы избежать двусмысленности. –

2

yield - ключевое слово для контекста. Это может быть обычное ключевое слово, но они решили сделать его ключевым словом контекста.

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

Например, представьте компиляции этого кода после yield был добавлен в качестве обычного ключевого слова:

bool yield = false; 
// bla bla 

Это не будет работать очень хорошо, что это? Вам нужно будет переименовать переменные, прежде чем вы сможете скомпилировать их с более новой версией.

Смежные вопросы