Динамическое заражение, часть вторая

В прошлый раз мы обсуждали, как параметр «dynamic» стремится расшириться по программе подобно вирусу: если выражение типа dynamic «касается» другого выражения, то последнее зачастую тоже становится типа dynamic. Сегодня я хочу остановиться на менее всего понимаемом аспекте вывода типа метода, который также применяет модель заражения, когда в игру вступает параметр «dynamic». Постоянные читатели знают, что…

0

Группа из одного метода

На этой неделе я реализовывал семантический анализ динамических выражений в проекте Roslyn, так что я исследовал множество вопросов со своей командой, касающихся дизайна динамических возможностей в C# 4. В этом контексте мне очень часто задают следующий вопрос: public class Alpha {   public int Foo(string x) { … } } … dynamic d = whatever;…

1

C# – это строго типизированный или слабо типизированный язык?

Сегодняшний пост, как обычно будет представлен в виде диалога. C# – это строго типизированный или слабо типизированный язык программирования? Да. Ответ не очень-то полезный. Я серьезно. Любопытно, что если вы перефразируете свой вопрос так, чтобы в нем было «И», то ответ будет таким же. Что? Вы имеете в виду, что C# является и строго типизированным…

3

Глупая последовательность глупа

Сегодняшний пост как обычно будет представлен в виде диалога. Почему в некоторых случаях использование ключевого слова var является обязательным для неявно типизированной локальной переменной, а иногда его использование запрещено? Это хороший вопрос, но нельзя ли немного конкретики? Для начала стоит перечислить случаи, когда неявно типизированная локальная переменная должна, а иногда не должна использовать var. Конечно….

2

Поведение, определяемое реализацией

Как я уже неоднократно упоминал в этом блоге ранее, язык C# был тщательно спроектирован таким образом, чтобы устранить некоторое «неопределенное поведение» или «поведение, определяемое реализацией», с которым можно столкнуться в языках типа С и С++. Но я забегаю вперед; начать нужно с нескольких определений. Обычно мы говорим, что некоторая идиома языка программирования обладает неопределенным поведением,…

1

null – это не false. Часть 3

Возвращаемся к теме нашего обсуждения: мы бы хотели позволить пользователям «перегружать» операторы & и | в языке C#, и если мы хотим перегружать эти операторы, то кажется, что должна существовать возможность перегрузки операторов && и ||. Но тогда мы сталкиваемся с большой проблемой. Обычно мы перегружаем оператор путем создания метода: class C { string s;…

0

null – это не false

В языке C# «null» используется для указания «отсутствия» значения или «некорректного» значения. Любой ссылочный тип может принимать значение «null», т.е. ссылка на самом деле никуда не указывает. А для любого «нормального» значимого типа существуют соответствующий «nullable» значимый тип, который может быть равен null. Но две эти концепции реализованы совершенно по-разному. Ссылка обычно представляет собой 32-х…

1

Следование шаблону

Недавно я получил следующий вопрос: Во время семантического анализа цикла foreach в языке C# используется подход на основе шаблона (pattern-based approach). Аналогично дело обстоит и с LINQ. А почему другие возможности языка, как например конструкция «using» также не использует этот подход? Отличный вопрос! Прежде всего, давайте рассмотрим, что же мы понимаем под «подходом на основе…

0

Локальные ссылки и возврат ссылок

«Возврат ссылок» является темой еще одного отличного вопроса на StackOverflow, которым я хочу поделиться со своей аудиторией. Начиная с C# 1.0 можно было создавать «синонимы» (alias) переменной путем «передачи ее по ссылке» в некоторый метод: static void M(ref int x) { x = 123; } … int y = 456; M(ref y); Несмотря на разные…

0

Сложности с необязательными параметрами. Часть 4

(Это четвертая и заключительная часть серии сообщений о сложностях с необязательными параметрами в языке C# 4; третья часть доступна здесь.) В прошлый раз мы обсуждали, что многие люди считают, что необязательные параметры генерируют несколько перегруженных версий метода для каждого вызова. Кроме того, некоторые полагают, что следующий код: void M(string format, bool b = false) {…

0