Если перевести слова .NET Runtime на русский язык, то мы получим что-то вроде "Среда выполнения". Именно в этой среде и выполняется код, получаемый в результате компиляции программы написанной на C#. .NET Runtime основан не на ассемблере (т. е. не на коде, родном для процессора), а на некотором промежуточном коде. Отдаленно он напоминает виртуальную Java машину. Только если в случае Java у нас был только один язык для виртуальной машины, то для .NET Runtime таких языков может быть несколько. Теоретически программа для среды .NET Runtime может выполняться под любой операционной системой, в которой .NET Runtime установлена. Но на практике пока единственная платформа для этого - это Windows.
.NET Runtime состоит из нескольких частей. Одна из них - это Common Language Runtime. Это, говоря кратко, некоторый набор стандартов, котрые должны поддерживать все языки платформы .NET. Например, в предыдущих версиях Visual Studio была такая проблема, что разные языки по-разному хранили данные одного по идее типа. Так, скажем, тип целого в Visual Basic'е занимал два байта, а в Visual C++ - четыре. А это порождало кучу проблем при совместном использовании языков. Так вот, Common Language Runtime как раз в частности и определяет стандартные для всеx языков .NET типы данных. И уже есть гарантии, что целый тип в одном языке будет в точности соответствовать одноименному типу в другом.
Еще одна важная часть .NET Runtime - это набор базовых классов. Их очень много (порядка несколько тысяч). Кроме того, эти классы относятся не к конкретному языку, а к .NET Runtime. Т. е. мы получаем набор классов, общий для всех языков .NET, что достаточно удобно.
Именно .NET Runtime берет на себя некоторые рутинные функции. Например, в нем организована сборка мусора. И если раньше программисту приходилось самому освобождать объекты, созданные динамически, то теперь эту задачу берет на себя среда .NET Runtime. Еще одно свойство среды .NET Runtime - это проверка типов. Означает это вот что. Когда программа выполняется, то в принципе некоторой функции можно подсунуть параметр неправильного типа. Скажем вместо целого подставить действительное число или еще что-нибудь в этом роде. Языки типа C++ свои параметры функций не проверяют, в результате чего записанная переменная большего размера может повредить чужую область памяти и программа может просто рухнуть. Еще классический пример на эту тему - это выход за пределы массива. В .NET Runtime же такого невозможно. .NET Runtime сама позаботится о проверке типов и других вещах.
Первая программа на C#
Пишем первую программу на C#. Наша программа просто выведет некоторое фиксированное слово в консольное окошко. Вот ее листинг.
using System;
namespace first {
class Class1 {
static void Main(string[] args) {
Console.WriteLine("Привет из C#");
} }}
Разберем текст программы поподробнее. В .NET Runtime существуют пространства имен. Одно из таких пространств - это System. Вообще-то оно добавляется автоматически в любой проект на C#. Так как мы добавили в нашу программу строчку
...
using System;
...
то мы можем вместо длинных имен использовать более короткие. В частности, вместо System.Console можно писать просто Console. Что мы делаем в строчке
...
Console.WriteLine("Привет из C#");
...
Далее мы в нашей программе объявляем класс Class1. Что такое классы мы посмотрим далее, сейчас же достаточно сказать, что в C# не существует глобальных функций, так что нам ничего не остается, как завести сначала класс и затем функцию Main в нем. Функция Main обязательно должна быть в каждой программе на C#, и именно с этой функции и начинается выполнение программы. Обратите также внимание, что эта функция пишеться с прописной (большой) буквы. C# различает строчные и прописные буквы. Кроме того, эта функция объявлена с модификатором static. Это означает, что она не относится к конкретному экземпляру класса Class1, а принадлежит всему классу. В нашей функции Main мы просто выводим на экран некоторую строчку методом WriteLine.