Перевод статьи From AS3 to C#, Part 1: Class Basics
Эта статья поможет разобраться в основах C# тем AS3 разработчикам, которые решили переключиться на Unity, но абсолютно не знакомы с программированием на C#.
Начнём с главного: С# файлы имеют расширение .cs, а не .as как AS3 файлы. Внутри файлов вы найдёте описание классов, из которых состоят приложения (аналогично AS3 файлам). Например, файл MyClass.cs:
1 2 3 4 |
class MyClass { } |
Название классов в C# подчиняется той же конвенции, что и названия классов в AS3: каждое слово в названии класса должно начинаться с большой буквы, остальная часть названия пишется в нижнем регистре. Как вы могли заметить, базовый синтаксис классов в C# такой же, как у классов в AS3.
Теперь давайте добавим переменную:
1 2 3 4 5 |
class MyClass { int X; } |
Определение переменных в C# отличается от AS3. Вместо var x:int, нужно использовать int X. Конвенция названий говорит, что названия переменных должны начинаться с большой буквы.
Давайте посмотрим на функции:
1 2 3 4 5 6 7 |
class MyClass { void Foo() { } } |
Функции в C# так же отличаются от функций в AS3. В C# не используется ключевое слово function, возвращаемый тип данный указывается вначале (а не в конце, как это было в AS3), название функций должно начинаться с большой буквы, исходя из конвенции названий.
Функция с входящими параметрами:
1 2 3 4 5 6 7 |
class MyClass { void Foo(int x, int y, int z) { } } |
Параметры функций, так же, как и в AS3, находятся внутри скобок, но записываются они немного по-другому: вначале тип, потом имя, с пробелом между ними. Конвенция говорит, что названия параметров функций должны начинаться с маленькой буквы.
Как и в AS3, параметры функций могут иметь значения по-умолчанию:
1 2 3 4 5 6 7 |
class MyClass { void Foo(int x = 1, int y = 2, int z = 3) { } } |
Функция-конструктор:
1 2 3 4 5 6 7 |
class MyClass { MyClass() { } } |
Как и в AS3, нам не обязательно указывать тип возвращаемого значения для функций-конструкторов. Вообще-то, у вас не получится указать даже тип данных void, как это можно было сделать в AS3. Так же, для объявления этого типа функций, не используется ключевое слово function.
Вы можете иметь больше одной функции-конструктора, это называется “перегрузка” функций:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
class MyClass { MyClass() { } MyClass(int x) { } MyClass(int x, int y, int z) { } } |
Перезагрузка так же доступна для других функций:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
class MyClass { void Foo() { } void Foo(int x) { } void Foo(int x, int y, int z) { } } |
Чтобы компилятор мог определить, какая из функций вызывается, необходимо придерживаться 2 правил. Во-первых, вы не можете иметь 2 функции с одинаковыми параметрами:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
class MyClass { void Foo(int x, int y, int z) { // Какой-то функционал } void Foo(int x, int y, int z) { // Какой-то другой функционал } } |
Это же касается тех функций, вызов которых может выглядеть одинаково, если не будет указан один из параметров по-умолчанию:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
class MyClass { void Foo(int x, int y, int z) { // Какой-то функционал } void Foo(int x, int y, int z, int w = 0) { // Какой-то другой функционал } } |
Во-вторых, вы не можете “перегружать” функции по типу данных, который они возвращают:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
class MyClass { int Foo(int x, int y, int z) { return 0; } uint Foo(int x, int y, int z) { return 0; } } |
Придерживаясь этих двух простых правил, вы сможете “перегружать” функции, сколько ваша душа пожелает =)
Как и в AS3, для определения статических функций необходимо добавить ключевое слово static:
1 2 3 4 5 6 7 |
class MyClass { static void Foo() { } } |
То же самое со статическими переменными:
1 2 3 4 5 |
class MyClass { static int X; } |
Теперь, когда мы знаем, как внутри классов определять классы, переменные, функции и конструкторы, давайте рассмотрим как использовать их:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
void SomeCode() { // Вызов конструктора по-умолчанию (например, без входящих параметров) MyClass mc = new MyClass() // Вызов другого конструктора mc = new MyClass(5); // Вызов функции mc.Foo(); // Вызов перегруженной функции mc.Foo(1, 2, 3); // Вызов статической функции MyClass.Foo(); // Получение значения переменной mc.X; // Установка значения переменной mc.X = 1; // By the way, single-line comments are the same... // Кстати, однострочные комментарии работают так же, как и в AS3... /* ... многострочные комментарие тоже. */ } |
Всё это очень похоже на AS3. Обратите внимание, что локальная переменная mc начинается с маленькой буквы, как и параметры функций.
Давайте обсудим модификаторы доступа. Стандартные модификаторы public, private и protected имеют такой же синтаксис и такое же поведение, как и в AS3. Для их использования достаточно просто добавить их перед возвращаемым типом данных функции, типом переменной или ключевым словом class:
1 2 3 4 5 6 7 8 9 |
public class MyClass { private int X; protected void Foo() { } } |
В C#, как и в AS3, существует модификатор доступа internal, который имеет такое же название, но немного другое поведение (по-сравнению с AS3). В AS3 модификатор internal означает “доступно для текущего класса и других классов в текущем пакете”. В C# он означает “доступно для текущего класса и остальных классов в текущей сборке”. Я расскажу про понятие “сборки” в других статьях, но пока что, думайте о них, как о группе классов, собранных в одном бинарном файле.
Так же, в C# есть модификатор protected internal, который является комбинацией protected и internal.
В завершении, сравнение описанных особенностей C# и AS3 кода:
|
|
Этим завершается первая часть цикла статей “С# для AS3 разработчиков“. Следующие статьи будут касаться более сложных тем, включая такие особенности C#, аналоги которых не существуют в AS3.
Оставайтесь на связи!