Люди всегда делились на две категории: одни всегда "впереди планеты всей", вторые их догоняют. В мире программирования всё происходит аналогично: одни используют новое ПО начиная с ранних CTP (Community Technology Preview) версий, вторые переходят на них, в лучшем случае, уже после релиза. Так сложилось и в ноём текущем проекте: .net framework 4.0 вышел достаточно давно, но перейти на него получилось только сейчас, и то не полностью.

Несмотря на то, что, как правило, переход на новую версию .net framework не вызывает особых проблем (код с 3.5 успешно работает в среде 4.0), некоторые нюансы всё же есть. Нише привожу описание шагов и проблем, с которыми столкнулся.

1. Открываем наш solution (project) в Visual Studio 2010. Тут не должно быть никаких проблем: IDE сама предложит сконвертировать ваши проекты в новый формат. Если в solution нет никаких специфических проектов (например, проекты, которые создаются какими-то плагинами и их поддержки нет из коробки), то вскоре вы увидете отчёт об успешной конвертации.

2. В свойствах каждого проекта меняем Target Framework на .NET Framework 4 и пробуем всё это скомпилировать. Честно говоря, я не слышал ещё, что бы у кого-то были проблемы с этим шагом.

3. Двигаемся дальше и пробуем запусти Web Application. Вот здесь нас и поджидают первые сюрпризы. Я рассматриваю вариант, когда сайт живёт на полноценном IIS7, а не на том веб-сервере, который встроен в Visual Studio. И если при конвертации проекта не был выбран пункт “Автоматически перевести все проекты на .NET 4.0” (такое вполне вероятно когда сначала был произведен переход на Visual Studio 2010, а смена версии .NET Framework производилась посже), то вместо привычного вида своего сайта видна серверная ошибка:

error

Ошибка появляется из-за того, что немного поменялся формат файла web.config и он стал несовместимым с предыдущей версией. Решение простое - поменять web.config. И тут, как всегда, есть два способа: ручной и автоматический. Я для себя выбрал более простой и быстрый способ №2 и его советую всем. Способ заключается в запуске комнсольной утилиты из поставки IIS7 appcmd.exe. Синткаксис выглядит так:

%systemroot%\system32\inetsrv\APPCMD.EXE migrate config "Default Web Site/YourSiteName"

Более подробно о всех ключах можно почитать в помощи:

%systemroot%\system32\inetsrv\APPCMD.EXE /?

4. После этих манипуляций должно всё заработать. Но я пошел немного дальше и захотел использовать Url Routing, который есть в ASP.NET 4 (более подробно о нем можно почитать в блоге Scott Guthrie) и при открытии страниц получал 404-ю ошибку - страница не найдена. Немного покопавшись в MSDN я понял, что причина проблемы - application pool, а вернее его Managed Pipilene Mode. После выбора пункта “Integrated” всё заработало. Более подробно почитать можно на сайте IIS7.

Я описал лишь те проблемы, которые были у меня. Возможно, у вас они будут другие или вам повезёт и всё пройдет так, как рассказывает Microsoft - 2-3 клика и проект работает без проблем. Мне не повезло :(.


Случилось так, что на работе попросили составить список из того, что нужно почитать/скачать/установить студентам, которые хотят писать на всеми любимом языке программирования C#. Решили, что раз они (студенты) этим интересуются, то вопрос "а оно нам(им) надо пропускаем.

Для начала начала необходимо установить сам .NET framework и какуе-то IDE. C IDE вариантов не много: или бесплатные express версии (http://www.microsoft.com/exPress/), или trial полнофункциональной Visual Studio (http://www.microsoft.com/visualstudio/en-us/default.mspx). Что дальше делать с триальной версией - каждый решает сам, но для студентов полно всяких програм, где можно получить всё это бессплатно и, главное, легально.

При установки Visual Studio рекомендую сразу поставить SQL Server Express Edition (http://www.microsoft.com/express/sql/default.aspx), т.к. я с трудом представляю какое более-менее большое приложение может работать без базы данных.

Из-за того, что упор делается на web-разработку, разу ставим Microsoft Web Platform Installer (http://www.microsoft.com/web/downloads/platform.aspx) - в нем уже есть всё нужное для разработки на платформе ASP.NET.

Всё установили, настроили - теперь можно писать свою первую (или не первую) программу на .NET. Вот только ещё не известно как писать! Предлагаю список литературы.

On-line сточники:

  • MSDN (Microsoft Developers Network): http://msdn.microsoft.com/en-us/default.aspx или русская версия http://msdn.microsoft.com/ru-ru/default.aspx. Там действительно есть всё, но использовать его в качестве учебника трудно и неудобно.
  • http://www.asp.net/learn/ - много разного обучающего видео, демонстрирующего возможности ASP.NET. К каждому ролику можно скачать исходный код проекта, на случай, если что-то не получается. Только не стоит увлекаться: там показывают только самые(!) простые вещи, которые в больших приложения требуют хорошей обработки напильником.
  • http://www.asp.net/community/projects/ - Starter Kits – готовые приложения с исходниками. Не знаю что ещё можно об этом сказать. Очень полезная вещь.
  • Всевозможные блоги, форумы, сообщества. Их сейчас очень много, т.ч. я не считаю что нужно их сдесть перечислять, всё-равно кому-то что-то не понравится.
  • ...
Книги:
  • Эндрю Троелсен. Язык программирования С# 2008 и платформа .NET 3.5 - своеобразный букварь по C#. Многие рекомендуют начинать именно с него.
  • Книги по ASP.NET от Дино Эспозито - у него несклько книг, ориентированных на разный уровень читателей, каждый может выбрать себе книгу "по душе".
  • Джеффри Рихтер. CLR via C#. Программирование на платформе Microsoft .NET Framework 2.0 на языке C# - отличнай книга, обязательна к прочтению каждым разработчиком, который пишет на .NET. Только я очень не(!) рекомендую начинать именно с неё. У меня было "тяжелое детство": начинал с Рихтера, поэтому пришлось читать 2 или 3 раза, чтобы понять о чём он пишет.
  • ...
Для начала, наверное хватит. To be continued...

 


Те, кто знает на память книгу Дж.Рихтера C# via .NET, в этом врядли найдут для себя что-то новое/интересное.
 

 Всё началось с того, что было у меня два похожих enum'ов (к примеру Numbers и BigNumbers) и нужно было как-то переменные первого типа приводить к другом, и наоборот. 

enum Numbers
    {
        One,
        Two,
        Three
    }

    enum BigNumbers
    {
        One,
        Two,
        Three,
        Four,
        Five
    }

На практике такие преобразования выглядят примерно так :

Numbers n1 = Numbers.One;
Numbers n2 = (Numbers) 2;
Int32 i1 = (Int32) n1;

BigNumbers b1 = BigNumbers.Five;

Numbers n3 = (Numbers) b1;

Console.WriteLine(String.Format("n1 = {0}", n1));
Console.WriteLine(String.Format("n2 = {0}", n2));
Console.WriteLine(String.Format("i1 = {0}", i1));
Console.WriteLine(String.Format("b1 = {0}", b1));
Console.WriteLine(String.Format("n3 = {0}", n3));
 

В результате на экране мы получим следующее:

n1 = One
n2 = Three
i1 = 0
b1 = Five
n3 = 4 

  Здесь мы видим, что n3 теперь равняется 4-м. Логичный, но не совсем ожидаемый для меня результат. В таком случае хотелось бы получить какой-то Exception.

 Теперь разберёмся что представляет собой enum и почему он так работает.

Enum (перечесляемый тим, enumerated type) предоставляет нам возможность хранить пару имя-значение и пришли в дополнение к константом (например: вместо того, чтоб в методе возвращать код ошибки, можно создать enum с именами ошибок).  По сути, System.Enum представляет обёкт размерного (value) типа, пронаследованного от System.ValueType:

 public abstract class Enum : ValueType, IComparable, IFormattable, IConvertible


И, по умолчию, запись  "enum Numbers" соответствует "enum Numbers : int". В этом можно убедится, посмотрев на наше приложение с помощью IL DASM, который входит в комплект поставки .NET Framework SDK.

.class private auto ansi sealed Enums.Numbers       extends [mscorlib]System.Enum{} // end of class Enums.Numbers
.field public static literal valuetype Enums.Numbers One = int32(0x00000000)

 
Таким образом мы видим, что все элементы нашего enum являются целыми числами (int). Вместо int, можно указать byte, sbyte, short, ushort, int, long, и ulong. Интересно что если указать имя типа так, как они именуются в FCL (Byte, Int32 и т.д.), то мы получим ошибку: 
 Type byte, sbyte, short, ushort, int, uint, long, or ulong expected
 
 
Вернёмся к нашему примеру. Чтоб в нём всё работало так, как ожидалось, достаточно добавить такой код:

 if (!Enum.IsDefined(typeof(Numbers), b1)){throw new ArgumentException();}

 

Enums.zip (3.01 kb)


Свершилось! Visual Studio 2010 and .NET Framework 4 Beta 1 качаем здесь, а отсюда качаем Visual Studio 2010 and .NET Framework 4 Training Kit - May Preview.

С момента выхода ASP.NET MVC идут обсуждения: будет ли он включен в состав .net framework или нет? Если верить слухам и некоторым сообщениям в msdn blogs, то рано или поздно это случится.

Текущая его версия Preview 5, доступная на CodePlex, говорит что до релиза проект ещё не готов, хотя некоторые надеялись, что ASP.NET MVC будет частью .net 3.5 sp1. Надежы, в большей степени, не оправдались. Почему в большей? Потому что сборки System.Web.Abstractions.dll и System.Web.Routing.dll, ранее присутствующие только в ASP.NET MVC, вошли в .NET 3.5 Service Pack 1.

Можно считасть что слияние началось и после релиза, который должен появиться в конце этого года, ASP.NET MVC станет неотъемлемой частью .net, как сейчас WebForms.


Приведение типов на практике встречается довольно часто. Из-за того, что в языке C# существует два оператора, позволяющих решить эту задачу, время от времени возникают InvalidCastException. Остановимся на этих операторах подробнее.

1. () оператор. На уровне IL-кода генерирует вызов функции castclass Выдержка из msdn: A cast explicitly invokes the conversion operator from one type to another; the cast fails if no such conversion operator is defined.
Оператор можно использовать только в том случае, если это предусмотрел разработчик.
Плюсы: простота в использовании, читабельность кода. Работает как с value, так и с reference типами.
Минусы: можно использовать не со всеми типами данных; источник InvalidCastException в случае неудачного вызова.


int? i1 = 2;
// вычисление значения i2
int i2 = (int)i1; // к этому моменту возможна ситуация, когда i1 будет равным null.


Еще один не менее распространённый пример:

public void MyMethod(object intObj)
{
if (intObj != null)
{
int intO = (int) intObj;
// ...
}
}

Такой код, как правило, используется когда порграммист уверен в том, что прийдёт нужный ему тип. Но, в случае использование сторонних библиотек или чужого кода вероятность такого поведения достаточно низкая.
2. Оператор as. На уровне IL-кода генерирует вызов функции isinst, в случае успешного выполнения которой происходит приведение типа. В противном случае – объекту присваивается null. Выдержка из msdn: The as operator is like a cast operation. However, if the conversion is not possible, as returns null instead of raising an exception.
Оператор работает со всеми reference-типами и выдаёт ошибку при компиляции в случае приминения к value-типу.
Плюсы: Работает с большинством типов данных. В случае неккоректного вызова не генерирет исключения. Не зависит от реализации класса.
Минусы: Не работает с vlue-типами. После вызова оператора желательна проверка на null:
string s = someObject as string;
if (s != null)
{
// someObject is a string.
}