Кода -копия выглядит следующим образом:
// комментарий на одну строку начинается с //
/*
Вот как многострочные комментарии
*/
/// <summary>
/// Комментарии к документу XML
/// </summary>
// Объявит пространство имен, используемые приложением
Использование системы;
Использование System.collections.generic;
Использование System.data.entity;
Использование System.dynamic;
Использование System.linq;
Использование System.Linq.Expressions;
Использование System.net;
Использование System.Threading.Tasks;
Использование System.io;
// Определите область и организуйте код в пакеты
Имен пространство обучения
{
// каждый файл .cs должен содержать хотя бы один класс с тем же именем файла, что и
// Вы можете этого не сделать, но это не очень хорошо.
Общественный класс Learncsharp
{
// Если вы использовали Java или C ++ раньше, вы можете прыгнуть непосредственно к следующему тексту «интересные функции»
Public Static Void Syntax ()
{
// Использование console.writeline для печати информации
Console.writeline ("Hello World");
Console.WriteLine (
"Интеллект:" + 10 +
"Двойной:" + 3.14 +
"Boolean:" + True);
// Печать с помощью консоли.
Console.write ("Привет");
Console.Write ("World");
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// /
// типы и переменные
//
// Использовать <Тип> <mame> для определения переменных
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// /
// sbyte - подписано 8 -битное целое число
// (-128 <= sbyte <= 127)
Sbyte foosbyte = 100;
// байт - без знака 8 -битного целого числа
// (0 <= byte <= 255)
Byte foobyte = 100;
// короткое - 16 -битное целое число
// Подписано - (-32 768 <= короткий <= 32 767)
// unsigned - (0 <= ushort <= 65 535)
Короткий Фушорт = 10000;
Ushort Fooushort = 10000;
// целое число - 32 -битное целое число
int fooct = 1; // (-2,147,483,648 <= int <= 2,147 483,647
uint foouint = 1;
// длинное - 64 -битное целое число
Long Retustong = 100000L; // (-9,223,372,036,854,775,808 <= LONG <= 9,223,372,036,854,775,807)
Ulong foolong = 10000L;
// число по умолчанию по умолчанию в int или uint (в зависимости от размера)
// Использование L, чтобы указать тип переменного значения, как длинный или Ulong
// Двойной - двойной 64 -битный IEEE 754 Номер плавающей запятой
Double Foodouble = 123,4; // Точность: 15-16 битов
// float - единственный 32 -разрядный IEEE 754 Номер плавающей запятой
Float Foofloat = 234.5f; // Точность: 7 битов
// Использование F, чтобы указать, что тип переменного значения - float
// Десятичный - 128 -битный тип данных, с более высокой точностью, чем другие типы с плавающими темпами, подходящие для финансов и финансов
Десятичный foodecimal = 150,3 м;
// логическое значение - true & false
Bool fooboolean = true; // или ложь
// char - один 16 -битный символ Unicode
char foochar = 'a';
// Строки - в отличие от предыдущего основного типа, строка не является значением, а ссылкой. Это означает, что вы можете установить строку на NULL.
string foostring = " /" escape /"Quotes и add /n (новые строки) и /t (вкладки)";
Console.WriteLine (Foostring);
// Вы можете получить доступ к каждому символу строки через индекс:
char char -charmstring = foostring [1]; // => 'e'
// Строка не может быть изменена: foostring [1] = 'x' не работает.
// Сравнение строк в соответствии с текущими настройками локали, нечувствительным к корпусу
string.compare (foostring, "x", stringcomparison.currentcultureignorecase);
// форматирование строк на основе Sprintf
string foofs = string.format ("проверка проверки, {0} {1}, {0} {1: 0.0}", 1, 2);
// дата и формат
DateTime foodate = datetime.now;
Console.writeline (woodate.tostring ("Hh: Mm, Dd Mmm yyyy"));
// Используйте символ @ для создания строк между линиями. Используйте "" для представления "
string bazstring = @"Вот кое -что
На новой линии!
// Использование const или только для чтения для определения констант, а константы вычисляются во время компиляции
const int womes_i_work_per_week = 9001;
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// /
// Структура данных
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// /
// массив - подсчет начинается с 0. При объявлении массива вам необходимо определить длину массива.
// Формат объявления массива заключается в следующем:
// <TATATYPE> [] <var name> = new <tataType> [<размер массива>];
int [] intarray = new Int [10];
// другие способы объявления и инициализации массивов:
int [] y = {9000, 1000, 1337};
// Доступ к элементам массива
Console.writeline ("intarray @ 0:" + intarray [0]);
// массив может быть изменен
Intarray [1] = 1;
// Список
// Списки используются чаще, чем массивы, потому что списки более гибки.
// формат списка объявлений заключается в следующем:
// list <Tacatype> <var name> = new List <Tanatype> ();
Список <int> intlist = новый список <int> ();
Список <string> stringlist = new List <string> ();
Список <int> z = новый список <int> {9000, 1000, 1337};
// <> для Generics - см.
// Для доступа к элементу списка нет значения по умолчанию.
intlist.add (1);
Console.writeline ("intlist @ 0:" + intlist [0]);
// Другие структуры данных:
// стек/очередь
// Словарь (реализация хэш -таблицы)
// Хэш -коллекция
// Коллекция только для чтения
// кортеж (.net 4+)
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// оператор
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
Console.writeline ("/n-> operators");
int i1 = 1, i2 = 2;
// Прямая арифметика
Console.WriteLine (i1 + i2 - i1 * 3/7);
// возьмите остальное
Console.WriteLine ("11%3 =" + (11%3);
// Сравните операторов
Console.WriteLine ("3 == 2?" + (3 == 2));
Console.WriteLine ("3! = 2?" + (3! = 2));
Console.WriteLine ("3> 2?" + (3> 2));
Console.WriteLine ("3 <2?" + (3 <2));
Console.WriteLine ("2 <= 2?" + (2 <= 2));
Console.WriteLine ("2> = 2?" + (2> = 2));
// бит оператор
/*
~ Реверс
<< Двигайтесь влево (подписано)
>> Двигайтесь вправо (подписано)
& и
^ Bitwise xor
|
*/
// самообвинение, самообъектив
int i = 0;
Console.writeline ("/n-> inc/decrementation");
Console.WriteLine (i ++);
Console.WriteLine (++ I);
Console.writeline (i--);
Console.WriteLine (-i);
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Структура управления
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
Console.writeline ("/n-> управляющие структуры");
// если оператор, аналогичный C
int j = 10;
if (j == 10)
{
Console.WriteLine («Я печатаю»);
}
иначе if (j> 10)
{
Console.WriteLine («Я не»);
}
еще
{
Console.WriteLine («Я тоже не»);
}
// Трехстороннее выражение
// простое утверждение if/else может быть написано как:
// <sonday>?
String istrue = (true)?
// пока петля
int foowhile = 0;
В то время как (foowhile <100)
{
// итерации 100 раз, foowhile 0-> 99
foowhile ++;
}
// делать, пока петля
int foodowhile = 0;
делать
{
// итерации 100 раз, WOODOWHILE 0-> 99
FOODOWHILE ++;
} while (foodowhile <100);
// для петли
// для структуры цикла => for (<Исходное условие>; <dondent>; <Шаг>)
для (int foofor = 0; foofor <10; foofor ++)
{
// итерации 10 раз, Фуфор 0-> 9
}
// Foreach Loop
// Foreach Loop Structure => foreach (<Iter Type> <iter> в <перечисленной структуре>)
// Цикл Foreach подходит для любого объекта, который реализует Ienumerable или Ienumerable.
// Типы сбора (массивы, списки, словари ...) в рамках .NET Framework все реализуют эти интерфейсы.
// В следующем коде можно удалить toCharraray (), потому что строка также реализует Ienumerable.
Foreach (char permance in "hello world" .tchararray ())
{
// Итерация через все символы в строке
}
// оператор переключения
// Переключатель подходит для типов данных байтовых, коротких, ЧАР и INT.
// также применимо к перечисленным типам, включая классы строк,
// и некоторые классы, которые инкапсулируют исходные значения: символ, байт, короткий и целый ряд.
int месяц = 3;
Строка месяцев трюка;
Переключить (месяц)
{
Случай 1:
Месяцы на тростнике = "январь";
перерыв;
Случай 2:
Месяцы на тростнике = "февраль";
перерыв;
Случай 3:
Месяцнография = "Март";
перерыв;
// вы можете соответствовать нескольким операторам случая одновременно
// но вам нужно использовать перерыв после добавления оператора дела
// (в противном случае вам нужно явно использовать оператор DOTO CASE X)
Случай 6:
Случай 7:
Случай 8:
Месяцы на тему = "Лето !!";
перерыв;
по умолчанию:
Месяцнография = "какой -то другой месяц";
перерыв;
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// конвертировать строку в целое число, и исключение будет добавлено, если преобразование не удалось:
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// преобразование данных
// конвертировать строку в целое число, и исключение будет добавлено, если преобразование не удалось:
int.parse ("123"); // return "123"
// Tryparse попытается преобразовать тип, и если он не удастся, он вернет тип по умолчанию, например, 0
int tryint;
if (int.tryparse ("123", out tryint)) // funciton - это логическое
Console.WriteLine (TryInt);
// преобразовать целые числа в строки
// конвертирование класса предоставляет ряд удобных методов преобразования
Convert.toString (123);
// или
tryint.toString ();
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// добрый
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
Общественные статические классы void ()
{
// см. Объявление объекта в конце файла
// Инициализировать объект с новым
Велосипедный путь = новый велосипед ();
// Вызовите метод объекта
trek.speedup (3);
trek.cadence = 100;
// Просмотреть информацию объекта.
Console.writeline ("Информация по пути:" + trek.info ());
// создание новой копейки Фартинг
PennyFarthing Funbike = новый PennyFarthing (1, 10);
Console.writeline ("Funbike Info:" + funbike.info ());
Console.read ();
} // Конец главный метод
// программа терминала терминала должна иметь основной метод в качестве входа
Public Static Void Main (String [] args)
{
Другие InterestingFeatures ();
}
//
// интересные функции
//
// Подпись метода по умолчанию
общественная // видимость
static // позволяет сначала прямые вызовы к классам без создания экземпляров
int // возвращаемое значение
Methonsignatures (
int maxcount, // первая переменная, тип является целым числом
int count = 0, // Если входящего значения не передается, значение по умолчанию равно 0
int ore = 3,
Params string [] Другие Params // Понимают другие параметры
)
{
возврат -1;
}
// метод может быть переименован до тех пор, пока подпись отличается
Public Static Void Methodnignature (String MaxCount)
{
}
// generics
// Классы TKEY и TVALUE указываются при вызове функции с пользователем.
// Следующая функция имитирует SetDefault Python
Public Static Tvalue SetDefault <TKEY, TVALUE> (
ИДИЦИЯ <TKEY, TVALUE> Словарь,
TKEY KEY,
Tvalue defaultiTem)
{
Результат TVALUE;
if (! Dictionary.trightValue (Key, Out Result))
вернуть словарь [Key] = defaultItem;
результат возврата;
}
// Вы можете ограничить диапазон входящих значений
public static void iterateAndprint <t> (t toprint), где t: ienumerable <int>
{
// мы можем итерации, потому что t перечисляется
Foreach (var item в toprint)
// ittm - целое число
Console.writeline (item.tostring ());
}
Public Static Void Other InterestingFeatures ()
{
// Дополнительные параметры
Methodingignatures (3, 1, 3, «некоторые», «дополнительные», «струны»);
Methonsignatures (3, другое: 3);
// Расширение метода
int i = 3;
i.print ();
// может быть нулевой тип очень полезен для взаимодействия с базой данных и возвращаемых значений.
// Любой тип значения (т.е. не является классом) будет добавлен в нулевой тип после добавления суффикса?
// <Тип>?
int?
Console.writeline ("Nullable переменная:" + nullable);
bool hasvalue = nullable.hasvalue;
//?
// В случае, если переменная является нулевой
int nottullable = nullable ?? 0; // 0
// Вывод типа переменной
// Вы можете позволить компилятору вывести типы переменных:
var Magic = "Magic - это строка, во время компиляции, так что вы все еще получаете безопасность типа";
// Magic = 9;
// generics
//
var PhoneBook = новый словарь <string, string> () {
{"Сара", "212 555 5555"} // Добавить новую запись в телефонную книгу
};
// Call SetDefault, определенная выше как общий
Console.WriteLine (setDefault <String, String> (телефонная книга, "Shaun", "No Phone"));
// Вам не нужно указывать TKEY или TVALUE, потому что они будут неявно получены
Console.WriteLine (SetDefault (телефонная книга, «Сара», «Нет телефона»); // 212 555 5555
// Lambda Expression - позволяет вам решать функции с одной строкой кода
Func <int, int> square = (x) => x * x;
Консоль.writeline (квадрат (3));
// Отказ от управления ресурсами - позволяет легко справляться с неуправляемыми ресурсами. Большинство объектов, которые получают доступ к неуправляемым ресурсам (операторы файлов, контекст устройства и т. Д.) Реализуют интерфейс Idisposable.
// Оператор использования очистит идентифицируемый объект для вас.
Использование (streamwriter writer = new Streamwriter ("log.txt"))))
{
writer.writeline («Ничего подозрительного здесь»);
// В конце сферы действия ресурс будет переработан
// (даже если исключение брошено, оно все равно будет переработано)
}
// Параллельная структура
// http://blogs.msdn.com/b/csharpfaq/archive/2010/06/01/parallel-programming-in-net-framework-4-getting-started.aspx
var webites = new String [] {
"http://www.google.com", "http://www.reddit.com",
"http://www.shaunmccarthy.com"
};
var actions = new Dictionary <String, String> ();
// Откройте новый поток для каждого запроса и объедините результаты перед выполнением следующего шага
Parallel.foreach (веб -сайты,
new Paralleloptions () {maxdegreeofparallelism = 3}, // макс. 3 потока
веб -сайт =>
{
// Сделайте что -нибудь, что занимает много времени на файле
Использование (var r = webRequest.create (new URI (веб -сайт)). getResponse ())
{
Ответы [Веб -сайт] = R.ContentType;
}
});
// Следующий код не будет запускать до тех пор, пока все запросы не будут выполнены
Foreach (var key in response.keys)
Console.WriteLine ("{0}: {1}", Key, ответы [Key]);
// Динамические объекты (это очень удобно использовать с другими языками)
Dynamic Student = new Expandoobject ();
Student.firstname = "Имя"; // Сначала не нужно определять класс!
// Вы даже можете добавить методы (принять строку, вывести строку)
Student.introduce = new Func <String, String> (
(Investuceto) => string.format ("hey {0}, это {1}", study.firstname, invituceto));
Console.writeline (student.introduce ("beth"));
// iqueryable <t> - почти все коллекции реализуют его, принося вам подход карты/фильтра/уменьшения стиля
var bikes = новый список <vicycle> ();
Bikes.sort (); // Сортирует массив
bikes.sort ((b1, b2) => b1.wheels.compareto (b2.wheels));
var result = велосипеды
. Где (b => b.wheels> 3) // Фильтр - можно использовать в цепях (вернуться в iqueryable)
. Где (b => b.i -isbroken && b.hastassles)
. Select (b => b.toString ());
var sum = bikes.sum (b => b.wheels);
// Создать список неявных объектов, сгенерированных на основе некоторых параметров велосипеда
var bikesummary = bikes.select (b => new {name = b.name, isawesome =! b.isbroken && b.hastassles});
// Трудно продемонстрировать, но компилятор может вывести приведенные выше типы объектов, прежде чем код будет составлен.
Foreach (var bikesummary в Bikesummary.where (b => b.isawesome))
Console.WriteLine (Bikesummary.name);
// Аспараллель
// Злые характеристики - Объединение LINQ и параллельных операций
var triweleers = bikes.asparallel (). где (b => b.wheels == 3). Select (b => b.name);
// Приведенный выше код будет работать одновременно. Поток будет автоматически открыт, и результаты будут рассчитаны отдельно. Подходит для сценариев с несколькими ядрами и большими данными.
// linq - карта iqueryable <t> для хранения, выполнение задержки, такая как база данных отображения LinqtoSQL, документы XML LINQToxML.
var db = new BikerSpository ();
// выполнение отложено, что хорошо для запроса базы данных
var filter = db.bikes.where (b => b.hastassles);
Если (42> 6) // Вы можете непрерывно увеличивать фильтрацию, включая условную фильтрацию, например, для расширенного поиска функции поиска
Filter = Filter.where (B => B.ISBRED);
var Query = фильтр
.Orderby (b => B.wheels)
.Thenby (b => b.name)
. Select (b => b.name);
// теперь запустите запрос, и читатель будет открыт при запуска запроса, так что вы итерации над копией
Foreach (струнный велосипед в запросе)
Console.writeline (результат);
}
} // end LearnCsharp Class
// вы можете включить другие классы в том же файле .cs
Общественные статические расширения класса
{
// расширенная функция
Public Static Void Print (этот объект OBJ)
{
Console.writeline (obj.tostring ());
}
}
// объявить синтаксис класса:
// <public/private/Protected/Internal> Class <Имя класса> {
// // Поля данных, конструкторы, внутренние функции.
/// В Java функции называются методами.
//}
Общедоступный велосипед
{
// велосипедные поля и переменные
public int cadence // public: доступно в любом месте
{
Get // Get - Определите метод для получения атрибутов
{
вернуть _cadence;
}
Установить // set - определить метод для установки свойств
{
_cadence = значение;
}
}
private int _cadence;
Защищенные виртуальные классы int gear // можно получить доступ к классам и подклассам
{
Get;
набор;
}
Внутренние колеса int // Внутренние: можно получить доступ в той же сборке
{
получать;
Частный набор;
}
int _speed;
public name {get;
// Тип перечисления содержит набор констант, которые отображают имя по значению (если не указано иное, целое число).
// Типы элемента enmu могут быть байтовые, Sbyte, Short, Ushort, Int, Uint, Long, Ulong. Enum не может содержать одинаковое значение.
Общественный enum bikebrand
{
Аист,
BMC,
Electra = 42, // Вы можете явно присваивать значения
Gitane // 43
}
// Этот тип мы определяем в классе велосипеда, так что это встроенный тип. Код за пределами этого класса должен ссылаться с использованием bicycle.brand.
общественный велосипедный бренд;
// Статический метод
// Тип статического метода сам по себе является и не принадлежит конкретному объекту. Вы можете получить доступ к ним без ссылки на объекты.
статический общественный int bicyclescreated = 0;
// значение только для чтения
// Значения только для чтения определяются во время выполнения, и им могут быть назначены только значения в объявлении или конструкторе.
readonly bool _hascardsinpokes = false;
// Конструкторы - это способ создания классов.
// ниже - конструктор по умолчанию.
общественный велосипед ()
{
this.gear = 1; // Вы можете использовать ключевое слово для доступа к членам объекта
Cadence = 50;
_speed = 5;
Name = "bontrager";
Brand = bikebrand.aist;
Bicyclescreated ++;
}
// другой пример конструктора (включая параметры)
общественный велосипед (int startCadence, int startSpeed, int startgear,
Название строки, Bool Hascardsinspokes, бренд велосипедов)
: base () // база первого вызова
{
Gear = startGear;
Cadence = startCadence;
_speed = startSpeed;
Имя = имя;
_hascardsinpokes = hascardsinspokes;
Бренд = бренд;
}
// конструктор можно использовать в цепях
Общественный велосипед (int startcadence, int startspeed, бренд велосипедов):
Это (StartCadence, StartSpeed, 0, «Большие колеса», правда, бренд)
{
}
// Синтаксис функций:
// <public/private/protected> <return value> <имя функции> (<параметр>)
// Классы могут реализовать методы Getters и Setters для своих полей для полей, или они могут реализовать свойства (C# рекомендуется использовать это).
// Параметры метода могут иметь значения по умолчанию. В случае значений по умолчанию соответствующие параметры могут быть опущены при вызове метода.
Public void Speedup (int Increment = 1)
{
_speed += Приращение;
}
Public Void замедление (int decrement = 1)
{
_speed -= depline;
}
// Свойства могут получить доступ и устанавливать значения. Когда необходимо получить доступ только к данным, рассмотрите возможность использования свойств. Атрибуты могут определить GET и SET, или оба.
Приватный Bool _hastassles; // Приватная переменная
Public Bool Hastassles // Public Accessont
{
получить {return _hastassles;
set {_hastassles = value;
}
// Вы можете определить автоматические свойства в пределах одной строки, и этот синтаксис автоматически создаст запасные поля. Вы можете установить модификаторы доступа для Getters или Setters, чтобы ограничить их доступ.
Public Bool Isbroken {get;
// реализация атрибутов может быть автоматической
Public Int Ramesize
{
получать;
// Вы можете указать модификаторы доступа для получения или установки
// Следующий код означает, что только велосипедный класс может вызвать набор Rameize
частный набор;
}
// метод отображения свойств объекта
Общественная виртуальная строка информация ()
{
вернуть "Gear:" + Gear +
"Каденс:" + Каденция +
"Скорость:" + _Speed +
"Имя:" + Имя +
"Карты в спицах:" + (_hascardsinspokes? "Да": "Нет") +
"/n ------------------------------/n"
}
// Метод может быть статичным. Обычно используется в вспомогательных методах.
Public Static Bool DidWecReateenEnoughbycles ()
{
// в статических методах вы можете обратиться только к статическим членам класса
Возврат Bicyclescreated> 9000;
} // Если вашему классу нужны только статические участники, рассмотрите возможность взять весь класс в качестве статического класса.
} // заканчивается велосипедным классом
// PennyFarthing - это подкласс велосипеда
класс PennyFarthing: Велосипед
{
// (Пенни Фартингс - велосипед с большим передним колесом. Без передачи.)
// Вызов родительского конструктора
Public PennyFarthing (int startCadence, int startSpeed):
База (StartCadence, StartSpeed, 0, "PennyFarthing", True, Bikebrand.Electra)
{
}
Защищенное переопределение int ear
{
получать
{
возврат 0;
}
набор
{
Бросьте новое ArgentException («Вы не можете переключить передачи на PenneFarthing»);
}
}
public переопределить string info ()
{
String Result = "PenneFarthing Bicycle";
Результат += base.toString ();
результат возврата;
}
}
// интерфейс содержит только подпись члена и не реализован.
интерфейс IJUpbable
{
void -прыжок (int meters);
}
Интерфейс Isbreakable
{
Bool Broken {get;
}
// классы могут наследовать только один класс, но они могут реализовать любое количество интерфейсов
Класс Mountainbike: Велосипед, Ijumpable, Imbreakable
{
int dearn = 0;
Public Void Jump (Int Meters)
{
урон += метры;
}
Общественная лопатка сломана
{
получать
{
Возврат повреждения> 100;
}
}
}
/// <summary>
/// Подключиться к базе данных, пример Linqtosql. Код EntityFramework сначала отличный (похожий на Activerecord Ruby, но он двусторонний)
/// http://msdn.microsoft.com/en-us/data/jj193542.aspx
/// </summary>
BikerSpository Public Class: DBSET
{
Public BikerSpository ()
: база()
{
}
Public DBSET <Ficycle> велосипеды {get;
}
} // Конечное пространство имен
Обратите внимание, что не покрытые темы:
1. флагс
2. Атрибуты
3. Статические свойства
4. Исследования, аннотация
6.asp.net (Web Forms/Mvc/Webmatrix)
6. Winforms
7. Фонд презентации Windows (WPF)