Синтаксис языка C SharpВ этой статье описывается синтаксис языка C#. Описываемый синтаксис полностью совместим с синтаксисом языка C# в .Net Framework и Mono. ОсновыИдентификаторыИдентификатор — это имя сущности в коде. Существует стандарт именования идентификаторов, который следует использовать в коде. Идентификатор может:
Идентификатор не может:
Ключевые словаКлючевые слова — это предварительно определенные зарезервированные идентификаторы, имеющие особое синтаксическое значение. Язык имеет два типа ключевых слов — зарезервированные в любой части кода и контекстные. Слова первого типа, например false или byte, могут быть использованы только как ключевые слова. Слова второго типа, например слово where, имеют особое значение только в определённом контексте и могут быть использованы в качестве идентификаторов вне него.[MSDN 1] Если всё же необходимо использовать ключевое слово в качестве идентификатора, то необходимо объявить его с помощью префикса @ — например, @byte.[MSDN 1]
Примеры: string @out; //Чтобы дать идентификатору имя, идентичное ключевому слову, необходимо использовать префикс @
string идентификатор; //C# поддерживает Юникод и допускает именование идентификаторов с помощью любых символов Юникода
string var {get; set;}; //Здесь не требуется использовать префикс @ т.к. var - контекстное ключевое слово
public void function()
{
var s = ""; //Для того, чтобы компилятор автоматически определял тип переменной, используется ключевое слово var
}
Литералы
ПеременныеПеременная — это идентификатор, содержащий какое-либо значение. Переменная определяется типом и именем, а также может инициализироваться при объявлении. Объявлять переменные можно только внутри функций. Объявлениеint variable; //Объявление неинициализированной переменной целочисленного типа с именем variable
Инициализацияint variable; //Объявление неинициализованной переменной
variable = 1; //Инициализация переменной
Объявление и инициализацияint variable = 1; //Одновременное объявление и инициализация переменной
Можно объявить сразу несколько переменных одного типа: int a, b;
int a = 2, b = 3;
Неявный тип
Если компилятор может определить тип переменной при инициализации, его можно опустить, заменив ключевым словом var : var chars = new char[] {'A', 'O'}; //преобразуется компилятором в char[] chars = new char[] {'A', 'O'};
var numbers = new List<int>(); //преобразуется компилятором в List<int> numbers = new List<int>();
См. также КонстантыКонстанта — это идентификатор, содержащий значение, которое запрещено менять во время выполнения программы. Константы неявно статические.
|
Категория операторов | Операторы |
---|---|
Арифметические | + - * / %
|
Логические (булевые и побитовые) | & | ^ ! ~ && ||
|
Конкатенация строк | +
|
Приращение, уменьшение | ++ --
|
Сдвиг | << >>
|
Сравнение | == != < > <= >=
|
Присвоение | = += -= *= /= %= &= |= ^= <<= >>=
|
Доступ к членам | .
|
Индексирование | [ ]
|
Приведение типов | ( )
|
Условные | ? :
|
Создание объекта | new
|
Информации о типе | as is sizeof typeof
|
Проверка переполнения | checked unchecked
|
Работа с указателями | * -> [] &
|
Перегрузка операторов
Некоторые операторы могут быть перегружены. Для перегрузки оператора необходимо определить статическую функцию, у которой имя состоит из ключевого слова operator
и собственно самого оператора. Для унарных операторов функция должна иметь один параметр, для бинарных и операторов сравнения — два. В обоих случаях один из параметров должен иметь тот же тип, что и класс или структура, его объявившие.
public static Foo operator+(Foo foo, Bar bar)
{
return new Foo(foo.Value + bar.Value);
}
Список перегружаемых операторов:
Операторы | |
---|---|
Унарные операторы | + - ! ~ ++ -- true false
|
Бинарные операторы | + - * / % & | ^ << >>
|
Операторы сравнения
могут быть перегружены только попарно |
== != < > <= >=
|
- Операторы присваивания (
+=, *=
и др.) нельзя перегрузить, но они являются компинацией оператора (=
) и одного из бинарных операторов, а бинарные операторы можно перегрузить. - Оператор приведения типа (
( )
) не может быть перегружен, но вы можете определить новые операторы преобразования с помощью explicit и implicit. - Оператор индексирования массива (
[ ]
) нельзя перегрузить, но можно определить новые индексаторы.
См. также
Операторы преобразования и приведения типа
Оператор приведения типа не может быть перегружен, однако вы можете определить операторы явного преобразования (приведения типа) — explicit и неявного преобразования — implicit. Они различаются тем, операторы неявного преобразования не должны генерировать исключения и должны обеспечить сохранность информации.[MSDN 10]. Для явного преобразования необходимо использовать оператор ( )
, для неявного — нет.
Оператор неявного преобразования
class Foo
{
public string Value;
public static implicit operator Foo(string value)
{
return new Foo(value)
}
}
//Неявное преобразование
Foo foo = "Example";
Оператор явного преобразования
class Foo
{
public string Value;
public static explicit operator Foo(string value)
{
if (value.IsNullOrEmpty()) throw new ArgumentException("String can not be null or empty!");
return new Foo(value)
}
}
//Явное преобразование
Foo foo = (Foo)"Example";
Foo fooNull = (Foo)""; //Ошибка
Оператор as
Оператор as
является оператором приведения типа. Если преобразование типа возможно, оператор вернёт объект указанного типа, в противном случае он вернёт null
.
Stream stream = File.Open(@"C:\Temp\data.dat");
FileStream fstream = stream as FileStream; //Will return an object.
String str = stream as String; //Will fail and return null.
Оператор ??
- Введено в C# 2.0
Если значение левой переменной равно null, то будет возвращено значение правой переменной, в противном случае будет возвращено значение левой переменной.
Следующий код
return ifNotNullValue ?? otherwiseValue;
эквивалентен
return ifNotNullValue == null ? otherwiseValue : ifNotNullValue;
Примечания
Статьи на MSDN
- ↑ 1 2 Ключевые слова C# . Дата обращения: 4 января 2011. Архивировано 13 декабря 2010 года.
- ↑ foreach, in . Дата обращения: 4 января 2011. Архивировано 13 декабря 2010 года.
- ↑ in (универсальный модификатор) . Дата обращения: 4 января 2011. Архивировано 5 августа 2010 года.
- ↑ Модификатор параметров out . Дата обращения: 4 января 2011. Архивировано 15 декабря 2010 года.
- ↑ out (универсальный модификатор) . Дата обращения: 4 января 2011. Архивировано 15 декабря 2010 года.
- ↑ Разделяемый (тип) . Дата обращения: 4 января 2011. Архивировано 15 декабря 2010 года.
- ↑ Разделяемый (метод) . Дата обращения: 4 января 2011. Архивировано 15 декабря 2010 года.
- ↑ where (ограничение универсального типа) . Дата обращения: 4 января 2011. Архивировано 15 декабря 2010 года.
- ↑ Предложение where . Дата обращения: 4 января 2011. Архивировано 15 декабря 2010 года.
- ↑ implicit . Дата обращения: 6 января 2011. Архивировано 3 апреля 2011 года.
Прочее
- ↑ What character escape sequences are available? Дата обращения: 4 января 2011. Архивировано 28 мая 2010 года.