Случилось так, что на работе попросили составить список из того, что нужно почитать/скачать/установить студентам, которые хотят писать на всеми любимом языке программирования 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.
}

e0ne's comments

A Web Developer's Blog!