Структура найпростішої програми на мові С#:
using System;
class клас {
public static int Main(string[] args) {
програмний код
return 0;
}
або
public static void Main() {
програмний код
}
}
Клас - це обумовлений користувачем тип даних. Клас можна уявити собі як креслення, за яким організовуються його члени. На відміну від класу об'єктом називається конкретний примірник певного класу, з допомогою якого зазвичай проводяться певні дії в програмі. Для створення нового об'єкта в С# використовується ключове слово new. Синтаксис оператора new виглядає так:
клас змінна=new клас();
або
клас мінлива;
змінна=new клас();
Ключове слово new означає, що середовищі виконання слід виділити необхідну кількість оперативної пам'яті під створюваний об'єкт. Виділення пам'яті проводиться з "керованої купи" (managed heap). В С# мінлива будь-якого класу - це посилання на об'єкт в пам'яті, але не сам об'єкт. При створенні змінної будь-якого класу використовується конструктор класу. Конструктор класу являє собою метод з ім'ям, що збігається з назвою класу, і не повертає ніякого значення. У класі можуть бути визначені кілька конструкторів, які беруть різну кількість параметрів. Якщо в класі явно не визначено конструктор, то компілятор автоматично створює конструктор за замовчуванням без параметрів, в якому дані класу отримують значення за замовчуванням. Конструктор за замовчуванням без параметрів може бути також явно визначений у класі (див. нижче).
Для введення-виведення інформації на консоль використовується клас Console. Для введення інформації використовуються статичні методи int Read() (зчитує один символ з клавіатури) і string ReadLine() (зчитує рядок з клавіатури до натискання клавіші Enter). Для виведення інформації використовуються статичні методи void Write(string value) (виводить рядок екран) і void WriteLine(format string, params object[] args) (виводить рядок на екран і переводить курсор на новий рядок).
Для форматування рядків використовується статичний метод string Format(format string, params object[] args) класу String. Також форматування рядків застосовується при виводі інформації на консоль (див. вище). У рядку формату застосовуються символами узагальнення (записуються за допомогою фігурними дужками, в яких указується порядковий номер що підставляється значення) і, якщо необхідно, після символу двокрапки параметри форматування (eN - виведення числа в экспоненциальном форматі з N знаками в мантиссе; fN - виведення числа з фіксованою точність з N знаками після коми; x - висновок цілого числа в шістнадцятиричному форматі; c - виведення числа в грошовому форматі; p - виведення числа в процентному форматі з множенням кількості на 100; n - виведення числа з роздільниками між розрядами).
Всі типи в С# поділяються на дві основні різновиди: структурні типи (value-based) і смітники типи (reference-based). До структурних типами відносяться всі числові типи даних (int, float та ін.), а також перерахування (єдина) і структури (struct). Пам'ять для структурних типів виділяється з стека. При присвоєнні змінної одного структурного іншого типу змінної відбувається побітне копіювання значення першої змінної у другу змінну. Для створення змінних структурного типу оператор new не використовується (за винятком виклику конструктора з параметрами для структур). До ссылочным типами відносяться класи (class) і інтерфейси (interface).
Пам'ять для посилальних типів виділяється з "керованої купи". При присвоєнні змінної одного посилального іншого типу змінної створюється ще одна посилання, що вказує на ту ж область пам'яті, що й перша мінлива. Для створення змінних посилального типу використовується оператор new.
В С# всі типи даних (як структурні, так і смітники) є похідними від класу Object. Клас Object визначає загальну полиморфическое поведінка для всіх типів даних. Визначення класу Object:
public Object class{
public Object();
public virtual Boolean Equals (Object obj);
public virtual Int32 GetHashCode();
public Type GetType();
public virtual String ToString();
protected virtual void Finalize();
protected Object MemberwiseClone();
public static bool ReferenceEquals(Object objA, Object objB);
}
Метод Equals виконує перевірку того, що порівнюються об'єкти вказують на одну і ту ж область пам'яті. Метод GetHashCode возвращает ціле число, яке ідентифікує конкретний об'єкт даного типу. Метод GetType возвращает опис типу того об'єкта, для якого він був викликаний. Метод ToString возвращает рядкове представлення об'єкту. Метод Finalize викликається перед видаленням об'єкта (див. нижче). Метод MemberwiseClone використовується для створення ще однієї посилання на область пам'яті, займану даним об'єктом. Метод ReferenceEquals виконує перевірку того, що порівнюються об'єкти вказують на одну і ту ж область пам'яті.
Перелік вбудованих типів мови C# і відповідних їм системних типів .NET:
byte (Byte) - ціле в діапазоні від 0 до 255;
short (Int16) - ціле в діапазоні від -32768 до 32767;
int (Int32) - ціле в діапазоні від -2 147 483 648 до 2 147 483 647;
long (Int64) - ціле в діапазоні від -9 223 372 036 854 775 808 до 9 223 372 036 854 775 807;
char (Char) - один 16-бітовий символ Unicode;
string (String) - рядок необмеженого розміру символів Unicode;
float (Single) - число з плаваючою точкою від 10(-45) до 10(38);
double (Double) - число з плаваючою точкою від 10(-324) до 10(308);
bool (Boolean) - логічне значення true або false;
object (Object) - все, що завгодно.
Для оголошення константи використовується ключове слово const.
Цикл з лічильником визначається наступним чином:
for(ініціалізація лічильника; умова; зміна лічильника)
тіло циклу
Цикл з лічильником припиняється в тому випадку, коли умова стає помилковим. Цикл з передумовою записується наступним чином:
while(умова)
тіло циклу
Цикл з передумовою припиняється в тому випадку, коли умова стає помилковим. Цикл з постумовою записується наступним чином:
do
тіло циклу
while(умова);
Цикл з постумовою припиняється в тому випадку, коли умова стає помилковим. Цикл з масивом записується наступним чином:
foreach(елемент масиву in масив)
тіло циклу
Цикл з масивом припиняється в тому випадку, коли буде закінчено перебір всіх елементів масиву. У всіх циклах можна застосовувати оператори break і continue.
Для перевірки умови використовується наступна конструкція:
if (умова)
умова вірно
else
умова false
Для множинною перевірки значення змінної використовується наступна конструкція:
switch(змінна){
case значення 1:
код для значення 1
break;
case значення 2:
код для значення 2
break;
default:
код для значення за умовчанням
}
Масив - це набір елементів одного типу, доступ до яких здійснюється з допомогою числового індексу. В С# масиви можуть бути простими або багатовимірними. Масиви оголошуються шляхом приміщення квадратних дужках після вказівки типу даних для елементів цього масиву. Синтаксис оголошення масиву:
тип[] масив=new тип[кількість елементів];
або
тип[] масив;
масив=new тип[кількість елементів];
Елементи масиву можуть бути ініціалізований при оголошенні:
тип[] масив={значення, значення, ...};
Для доступу до елемента масиву після його імені в квадратних дужках вказується індекс елемента. Індексація елементів масиву завжди починається з 0. Необхідно звернути увагу на те, що будь-який масив є похідним класом від класу Array. В наслідок цього будь-який масив в C# успадковує велика кількість корисних методів обробки елементів масиву. Для сортування масиву використовується статичний метод void Sort(Array array) класу Array (для виконання сортування необхідно, щоб для типу елементів масиву був реалізований інтерфейс IComparable). Для пошуку елемента масиву використовується статичний метод int BinarySearch(Array array, object value) класу Array (для виконання пошуку необхідно, щоб для типу елементів масиву був реалізований інтерфейс IComparable).
Для поліпшення структурування програмного коду в C# використовується простору імен. Для оголошення простору імен використовується наступна конструкція:
namespace ім'я{
визначення типів
}
У подальшому для звернення до типу, оголошеного в просторі імен, використовується конструкція имя.тип. Простору імен можуть бути вкладеними. Для підключення класів з будь-якого простору імен використовується конструкція using ім'я. Якщо підключено простір імен, то можна посилатися на тип і без вказівки простору імен.