Главная > .NET > MS Visual Studio «Oscar» и новые возможности С#. Часть первая — вводная

MS Visual Studio «Oscar» и новые возможности С#. Часть первая — вводная

18 октября 2007


Думаю, для дотнет-разроботчиков не является секретом то, что компания Microsoft собирается в ближайшем будущем выпустить релиз Visual Studio "Oscar" и .NET Framework 3.5. О новинках уже написано довольно много, и так же много есть открытых вопросов. К счастью, бета версии этих продуктов доступны для скачивания с сайта Microsoft, так что каждый может «пощупать» своими руками то, что ожидает нас в ближайшем будущем. Лично я так и сделал :). Результаты моего знакомства с этими продуктами я собираюсь выложить здесь в виде нескольких статей.

И в первой статье из этой серии я попытаюсь осветить свои впечатления от новых базовых возможностей C# компилятора - «неявно типизированные переменные» (implicitly typed variables) и «инициализация объектов и коллекций» (object and collection initialization).

В C# появилась возможность объявлять и инициализировать переменные без явного указания их типа, используя служебное слово «var». Например,

  1. var x = 5;

А теперь посмотрим на IL-код, который генерирует компилятор:

.locals init ([0] int32 x)
IL_0000: nop
IL_0001: ldc.i4.5

Как видно из этого, компилятор автоматически создает переменную нужного типа, базируясь на присваиваемом значении! Это важно, потому что можно было бы предположить, что созданная переменная будем иметь тип object. Фактически, CLR ничего не знает о использовании «var» - с ее точки зрения все выглядит так как будто бы мы явно указали тип переменной.

Итак, мы имеем следующие (и очень правильные) ограничения - инициализация неявно типизированной переменной обязательна, причем по значению можно явно определить тип. Код типа var x или var x = null вызывает ошибку компиляции.

Возможность неявной инициализации также касается объектов, массивов. Например, теперь можно написать:

  1. var myObjX = (MyClassX) myObjY;
  2. var myArray = new[] { "alpha", "beta", "release" };

При инициализации массива тип определяется по типам элементов. Если типы элементов разные и между ними нельзя произвести неявное преобразование - получим также ошибку компиляции.

А теперь об инициализации объектов и коллекций. Эта возможность более существенна с точки зрения написание краткого и выразительного кода.

Предложим, нужно создать объект и сразу проинициализировать его. Теперь это можно сделать таким образом:

  1. var pers = new Person()
  2. {
  3. FirstName = "Ivan",
  4. LastName = "Kohut",
  5. WebSite = new WebSiteInfo()
  6. {
  7. Title = "Alpha-Beta-Release",
  8. URL = "abrdev.com"
  9. }
  10. };

Напоминает JavaScript, правда?

Часто бывает так, что объект создается только для передачи как аргумент какому-то методу. Раньше для этого нужно было явно создавать локальную переменную. А сейчас мы можем сделать что-то типа:

  1. MyMethod(new Person()
  2. {
  3. FirstName = "Ivan",
  4. LastName = "Kohut"
  5. });

Следующее нововведение - это инициализация классов, которые реализуют интерфейс IEnumerable<T> и имеют открытый метод Add(T item). Например, List<string> теперь можно инициализировать так:

  1. var myList = new List<string>() { "alpha", "beta", "release" };

Сравните с вариантом для C# 2.0:

  1. List<string> myList = new List<string>();
  2. myList.Add("alpha");
  3. myList.Add("beta");
  4. myList.Add("release");

А теперь объединим вышеперечисленные возможности в одном примере:

  1. var x = MyMethod(new List<Person>()
  2. {
  3. new Person()
  4. {
  5. FirstName = "Bill",
  6. LastName = "Gates",
  7. },
  8. new Person()
  9. {
  10. FirstName = "Steve",
  11. LastName = "Ballmer",
  12. }
  13. });

Получается довольно элегантный и читабельный код, причем без ущерба для производительности - все дополнительные действия происходят на этапе компиляции.

Описанные в этой статье возможности конечно не претендуют на что-то сверхъестественное. Это приятные мелочи, которые помогают сделать код лучше. Но не только. Они служат базой для более существенных изменений и нововведений, речь о которых пойдет в следующих статьях.

Анонс
Следующая статья - о методах-расширениях (extension methods). Не уверен, что я правильно перевел этот термин на русский, так что если что - поправляйте в комментах, буду признателен :).

  1. Konstantin
    7 мая 2008 в 08:31 | #1

    Спасибо, интересная инфа🙂 🙂 😉

  2. unigguru
    8 июня 2008 в 17:56 | #2

    Очень интересно🙂🙂🙂🙂 спасибо за информацию🙂🙂🙂🙂 жду еще🙂🙂🙂

Комментирование отключено.
Developers.org.ua