Мова C #, Різне, Програмування, статті

Зміст



  Кілька фактів про мову C #


У цьому огляді ми познайомимося з новою мовою програмування C # (читається C Sharp – сі-дієз, тобто нота «сі», підвищена на півтона), нещодавно оголошеним фірмою Microsoft. У читача може виникнути цілком логічне запитання: навіщо потрібен ще одну мову програмування, коли у Microsoft є і Basic, і C / C + +, і Java, не кажучи вже про підмножині Visual Basic – Visual Basic for Application і скриптових мовах VBScript і JScript?


За словами менеджерів фірми Microsoft, мова C # створювався в першу чергу для розробників, що використовують C і С + +, щоб дозволити їм більш ефективно створювати Internet-додатки. Так, C # буде тісно інтегрований з мовою XML, протоколом SOAP та іншими Web-технологіями (на момент написання цього огляду деталі цієї інтеграції оголошені не були). Очевидно, що реалізувати будь-які нові можливості на рівні мови в мовах С / С + + не можна, так як в цьому випадку був би порушений ANSI-стандарт, язик Visual Basic не надає ряду можливостей С / С + +; з мовою Java також неможливо поводитися як із своїм власним. Тому фірма Microsoft вибрала інший шлях – створила нову мову.


Мова C # – це простий об’єктно-орієнтована мова, що нагадує С + + і Java, але при цьому в ньому немає деяких конструкцій. Наприклад, C # не підтримує макросів, шаблонів, директив # include, а також різних способів доступу до об’єктів – замість того, щоб думати над тим, коли використання точки (.), посилання (->) або оператор області дії (::), ви завжди використовуєте точку. Для того щоб знизити можливість внесення помилок у створюваний код, в C # введений механізм складання сміття (garbage-collection): вас більше не повинні турбувати покажчики, посилання або витоку пам’яті – за всім цим стежить виконує ядро мови. У мові немає глобальних змінних, множинного наслідування і ряду інших конструкцій.


Мова C #, разом з Visual Basic (Visual Basic. NET, що об’єднав в собі функціональність Visual Basic і VBScript), Visual C + + і скриптовою мовою JScript (JScript. NET), буде входити до складу Microsoft Visual Studio. NET (раніше називалася Visual Studio 7). Всі ці мови забезпечують доступ до платформи Microsoft. NET (раніше ця платформа називалася Next Generation Windows Services NGWS), яка містить загальне виконує ядро ​​і велику бібліотеку класів. Ядро працює на рівні спільної мови, відомого під назвою Common Language Subset (CLS, також називається Common Language Specification), який забезпечує взаємодію між усіма мовами і бібліотекою класів. Для розробників це означає, що C # матиме доступ до всіх засобів, знайомим розробникам на Visual Basic і Visual C + +.


Зазначимо, що у складі Microsoft Visual Studio. NET немає засоби розробки мовою Java – Microsoft Visual J + +. На думку багатьох аналітиків, Microsoft Visual J + +, тісно пов’язаний з платформою Windows, не отримав широкого розповсюдження, оскільки не володів ніякими перевагами перед з Visual Basic і Visual C + +. Також слід згадати про судовий позов фірми Sun з приводу порушення фірмою Microsoft ліцензійної угоди і введення розширень в мову; обговорення віртуальної машини Microsoft і т.п. Більш того, ліцензія Microsoft на мову Java закінчується в березні майбутнього року і швидше за все продовжена не буде. Фірма Rational Software працює над компілятором мови Java, який буде інтегруватися з Visual Studio. Net. Дата випуску цього компілятора поки не оголошена. Але повернемося до теми нашого огляду – мови C #.


За традицією, заведеною ще Керніганом і Річі в далеких уже 70-х, прийнято знайомитися з можливостями мови, написавши програму, що виводить на екран фразу «Hello, world». На мові C # така програма виглядає наступним чином:

 using System;
class Hello
{
static void Main() {
                Console.WriteLine(“Hello, world”);
        }
}

Давайте детально розглянемо кожен рядок цієї програми.


Директива using System вказує на те, що ми звертаємося до простору імен (namespace) System, що надається ядром Microsoft. NET. Це простір імен містить клас Console, що використовується в методі Main (). Простору імен служать для логічної організації елементів бібліотеки класів. Директива using дозволяє використовувати члени простору імен більш простим чином. Так, нижче ми використовуємо виклик Console.WriteLine, який є скороченим варіантом виклику System.Console.WriteLine. Відзначимо, що ця концепція схожа з директивою Use у мові Object Pascal.


Функція Main є статичним членом класу Hello. Як ми зазначили вище, глобальних змінних в мові не існує – змінні і функції завжди оголошуються всередині оголошень класів або структур.


Рядок «Hello, world» виводиться на екран методом WriteLine класу Console. Тут ми використовуємо єдину бібліотеку класів, доступну з C #, Visual Basic і Visual C + +. Мова C # не має власної бібліотеки класів.


Програми на C # зберігаються у файлах з розширенням. Cs – наша програма може бути збережена у файлі hello.cs, будучи скомпільованій пакетним компілятором csc:


csc hello.cs
перетвориться в виконуваний файл hello.exe, запуск якого на виконання призведе до висновку рядки «Hello, world» на екран.


Після того як ми отримали деяке уявлення про мову C #, давайте розглянемо його основні конструкції більш докладно.


Типи даних


У мові C # існує два різновиди типів даних: значимі типи (value types) і посилальні типи (reference types). До значимим типів відносяться прості типи (char, int, float), що перераховуються типи (Enum) і структури (struct), то є типи, безпосередньо містять дані. Посилальними типами є класи, інтерфейси, масиви (підтримуються одно-та багатовимірні масиви) і делегати: типи, що зберігають посилання на об’єкти.


Для завдання нових типів даних розробники можуть використовувати перерахування і структури, а також класи, інтерфейси і делегатів.


Визначені типи даних


Мова C # містить ряд зумовлених значущих і посилальних типів, більшість з яких прийшло з мов С / С + +.


До визначеним значімим типів відносяться цілочисельні типи (зі знаком – sbyte, short, int, long і без знака – byte, ushort, uint, ulong), числа з плаваючою точкою (float і double) і типи bool , Char і decimal.


Зумовлені посилальні типи представлені типами object і string. Тип object є універсальним базовим типом для всіх інших типів.


Для кожного зумовленого типу існує ключове слово, якому відповідає системне визначення. Наприклад, ключовим словом int відповідає визначення System.Int32.


У мові C # всі типи даних, включаючи і значущі типи, можуть розглядатися як об’єкти. Це дозволяє викликати методи навіть таких примітивних типів, як int. Наприклад:

 using System;
class Demo
{
        static void Main() {
                Console.WriteLine(3.ToString());
        }
}

Тут ми використовуємо метод ToString для виведення значення константи типу int. Погодьтеся, що це нагадує мову Java.


Вирази


Більшість виразів у C # успадковано з мов С / С + +, але тут є ряд доповнень і змін. Зазначимо, що підтримуються вирази з міткою і оператор goto (можна очікувати нову хвилю обговорень з приводу цього оператора, але мені здається, що він буде існувати до тих пір, поки існує асемблерна інструкція JMP), оголошення локальних констант і локальних змінних перерахуванням (const int b = 2, c = 3;), обчислювані вирази і функції, оператори switch, while, do, for, foreach (для перебору елементів колекцій), break, continue, return, throw, try, checked / unchecked (для контролю переповнення при виконанні арифметичних операцій і перетворення цілочисельних типів) і lock.


Класи


Оголошення класів використовуються для завдання нових посилальних типів. Мова C # не підтримує множинного спадкування, але клас може реалізувати декілька інтерфейсів. Членами класу можуть бути константи, поля, методи, властивості, індексатори, події, оператори, конструктори, деструктори і вкладені опису типів. Кожен член класу може мати описувач доступу.






















Описувач Призначення
public Члени доступні з усього коду
protected Члени доступні тільки з успадкованих класів
internal Члени доступні тільки з даного класу
protected internal Члени доступні тільки з успадкованих класів даного класу
private Члени доступні тільки з даного класу

Структури


Структури багато в чому схожі з класами – вони можуть реалізовувати інтерфейси, можуть мати члени, але відрізняються від класів тим, що є значущими, а не посилальними типами і не підтримують успадкування.


Інтерфейси


Інтерфейси (ключове слово interface) служать для опису способу звернення до класу або структурі. Інтерфейси можуть містити методи, властивості, індексатори і події. Наприклад, нижче показаний інтерфейс, містить індексатор, подія, метод і властивість.

 interface Idemo
{
        string this[int index] { get; set; }
        event EventHandler E;
        void F(int value);
        string P { get; set; }
}
public delegate void EventHandler(object sender, Event e);

Інтерфейси можуть задавати множинне спадкування; класи і структури можуть використовуватися для реалізації кількох інтерфейсів.


Делегування


Делегування дозволяє адресувати одні й ті ж покажчики на функції з мови C + + та інших мов. На відміну від покажчиків на функції, делегати є об’єктно-орієнтованими і типізований. Делегати – це посилальні типи, створені на базі загального класу System.Delegate.


Перерахування


Тип даних enum використовується для опису групи пов’язаних символічних констант. Цей тип даних робить код більш простим і дозволяє використовувати візуальні засоби, що полегшують написання такого коду.


Простору імен


У програмах на C # використовуються простору імен. Ці простору імен служать як для внутрішньої, так і для зовнішньої організації системи – для подачі способу представлення програмних елементів для програм. У розглянутим вище демонстраційній програмі ми вже бачили, як використовується простір імен.


Для реалізації простору імен використовується ключове слово namespace:

 namespace Microsoft.CSharp.Introduction
{
        public class HelloMessage
        {
                public string GetMessage() {
                        return “Hello, world”;
                }
        }
}

Реалізоване вище простір імен має ім’я Microsoft.CSharp.Introduction – простір імен Introduction міститься в просторі імен CSharp, яке, в свою чергу, міститься в просторі імен Microsoft. Ця ієрархія показана нижче:

 namespace Microsoft
{
        namespace CSharp
        {
                namespace Introduction
                {….}
        }
}

Тепер ми можемо переписати нашу демонстраційну програму так, щоб вона використовувала клас HelloMessage. Можна використовувати або повне ім’я класу – в нашому випадку це:


Microsoft.CSharp.Introduction.HelloMessage
або скористатися директивою using, як показано нижче.

 using Microsoft.CSharp.Introduction;
class Hello
{
        static void Main() {
                HelloMessage m = new HelloMessage();
                System.Console.WriteLine(m.GetMessage());
        }
}

У мові C # також можна використовувати псевдоніми. Це буває корисно в тих випадках, коли виникають суперечності в найменуваннях методів у двох або більше бібліотеках.


Властивості


Властивість – це іменований атрибут, асоційований з об’єктом або класом. Прикладами властивостей можуть бути довжина рядка, розмір шрифту, заголовок вікна, ім’я клієнта і т.п. Властивості є розширеннями полів: і ті й інші – це іменовані члени з асоційованими типами, а синтаксис доступу до полів і властивостями однаковий. На відміну від полів властивості мають механізм для асоціації дій з читання та запису атрибутів об’єкта.


Для завдання властивостей у мові C # використовується спеціальний синтаксис. Перша частина оголошення властивості схожа з оголошенням поля, друга частина включає опис способу отримання та установки значення – вони називаються get accessor і set accessor. Оголошення властивості Caption класу Button показано нижче:

 public class Button: Control
{
        private string caption;
        public string Caption {
                get {
                        return caption;
                }
                set {
                        caption = value;
                        Repaint();
                }
        }
}

Властивості доступні для читання і для запису. При зверненні до значення властивості викликається механізм читання (get accessor), при зміні значення викликається механізм записи (set accessor). Як ми зазначали вище, доступ до властивостей аналогічний доступу до полів:

 Button b = new Button();
b.Caption = “ABC”; / / встановити заголовок
string s = b.Caption; / / отримати заголовок
b.Caption + = “DEF”; / / отримати і встановити

Індексатори


Якщо властивості у мові C # можна розглядати як розширені поля, то індексатори – це розширені масиви. Як приклад розглянемо інтерфейсний елемент ListBox, в якому відображається набір рядків. Припустимо, що клас ListBox «хоче» зробити доступним масив, в якому зберігаються рядки, а також «хоче», щоб вміст інтерфейсного елементу автоматично оновлювалося при зміні масиву рядків. Для вирішення цього завдання можна використовувати індексатор. Синтаксис оголошення індексатора схожий з синтаксисом оголошення властивості – відмінністю є те, що індексатори безіменні (використовується ключове слово this), а додаткові параметри вказуються у квадратних дужках:

 public class ListBox: Control
{
        private string[] items;
        public string this[int index] {
                get {
                        return items[index];
                }
                set {
                        items[index] = value;
                        Repaint();
                }
        }
}

Нижче показаний приклад використання індексатора.

 ListBox listBox = …;
listBox[0] = “hello”;
Console.WriteLine(listBox[0]);

Події


Події дозволяють класу оголошувати нотифікації, до яких клієнти можуть приєднувати виконуваний код у вигляді обробників подій.


Оголошення події багато в чому схоже з оголошенням поля, за винятком того, що тут використовується ключове слово event. У наведеному нижче прикладі показано оголошення події Click типу EventHandler для класу Button.

 public delegate void EventHandler(object sender, Event e);
public class Button: Control
{
        public event EventHandler Click;
        public void Reset() {
                Click = null;
        }
}

Усередині класу Button член Click відповідає полю типу EventHandler, ззовні ж член Click може використовуватися тільки в лівій частині операторів + = і – =. Це обмеження дозволяє клієнтського коду тільки додавати або видаляти обробники подій. У наведеному нижче прикладі клієнтський код в класі Form1 додає обробник події Button1_Click для події Click класу Button. У методі Disconnect обробник події видаляється:

 using System;
public class Form1: Form
{
        public Form1() {
/ / Додати Button1_Click як обробник
/ / Події Button1.Click
                Button1.Click += new EventHandler(Button1_Click);
        }
        Button Button1 = new Button();
        void Button1_Click(object sender, Event e) {
                Console.WriteLine(“Button1 was clicked!”);
        }
        public void Disconnect() {
/ / Видалити обробник події Button1.Click
                Button1.Click – = new EventHandler(Button1_Click);
        }
}

Атрибути


C # є процедурним мовою і, як всі процедурні мови, містить деякі декларативні елементи. Наприклад, доступність методу класу описується атрибутами public, protected, internal, protected internal або private. Підтримка атрибутів у мові C # дозволяє програмістам створювати нові типи декларативної інформації і отримувати цю інформацію під час роботи програми. Наприклад, можна оголосити атрибут HelpAttribute, який буде використовуватися для асоціювання класів і методів з документацією по ним:

 [AttributeUsage(AttributeTargets.All)]
public class HelpAttribute: System.Attribute
{
        public HelpAttribute(string url) {
                this.url = url;
        }
        public string Topic = null;
        private string url;
        public string Url {
                get { return url; }
        }
}

Вище показана реалізація атрибута класу HelpAttribute, що має один позиційний параметр (string url) і один іменований аргумент (string Topic). Позиційні параметри служать для завдання параметрів конструкторів в класах з атрибутами, іменовані – для реалізації властивостей для читання-запису. Використання атрибутів показано нижче.

 [Help(“http://www.mycompany.com/…/Class1.htm”)]
public class Class1
{
        [Help(“http://www.mycompany.com/…/Class1.htm”, Topic =”F”)]
        public void F() {}
}

Для доступу до атрибутів під час виконання програми використовуються вбудовані механізми ядра Microsoft. NET. Наприклад:

 using System;
class Test
{
        static void Main() {
                Type type = typeof(Class1);
        object[] arr = _
                type.GetCustomAttributes(typeof(HelpAttribute));
                if (arr.Length == 0)
                 Console.WriteLine(“Class1 has no Help attribute.”);
                else {
                        HelpAttribute ha = (HelpAttribute) arr[0];
                        Console.WriteLine(“Url = {0}, Topic = {1}”, _
                        ha.Url, ha.Topic);
                }
        }
}

Висновок


В даному огляді ми познайомилися з новою мовою C #, який є одним з основних програмних елементів нової платформи Microsoft. NET. Ми розглянули основні можливості цієї мови, обговорили синтаксичні конструкції і показали кілька прикладів їх використання. Мова C # ще перебуває в стадії розробки, і ще не всі його можливості реалізовані. Після завершення роботи над специфікацією мови вона буде передана в комітет ECMA (www.ecma.org), Який займається різними стандартами, зокрема стандартом мови JavaScript (ECMAScript). На закінчення відзначимо, що минулого року фірма Sun направляла у комітет ECMA специфікацію мови Java, але відкликала її (пославшись на те, що в результаті процесу стандартизації Sun втратить можливість управляти розвитком мови), і тепер розвитком і стандартизацією Java займається Java Community Process.


Кілька фактів про мову C #


Мова C # увібрав в себе кращі риси мов С + + і Java; одним з його розробників був Андерс Хейлсберг (Anders Heilsberg) – творець TurboPascal і головний архітектор Delphi (до версії 4.0).



Схожі статті:


Сподобалася стаття? Ви можете залишити відгук або підписатися на RSS , щоб автоматично отримувати інформацію про нові статтях.

Коментарів поки що немає.

Ваш отзыв

Поділ на параграфи відбувається автоматично, адреса електронної пошти ніколи не буде опублікований, допустимий HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

*

*