C Sharp/Переменные: различия между версиями

Перейти к навигации Перейти к поиску
180 байт добавлено ,  2 года назад
м
<source> -> <syntaxhighlight> (phab:T237267)
м (<source> -> <syntaxhighlight> (phab:T237267))
 
Компилятор использует сведения о типе, чтобы убедиться, что все операции, выполняемые в коде, являются типобезопасными. Например, при объявлении переменной типа int, компилятор позволяет использовать в дополнение переменную и операции вычитания. При попытке выполнить эти же операции в переменной типа bool, компилятор вызовет ошибку, как показано в следующем примере:
 
<sourcesyntaxhighlight lang="csharp">
int a = 5;
int b = a + 2; //OK
// Error. Operator '+' cannot be applied to operands of type 'int' and 'bool'.
int c = a + test;
</syntaxhighlight>
</source>
 
;Примечание
При объявлении переменной или константы в программе необходимо либо задать ее тип, либо использовать ключевое слово var, чтобы дать возможность компилятору определить его. В следующем примере показаны некоторые объявления переменных, использующие встроенные числовые типы и сложные пользовательские типы:
 
<sourcesyntaxhighlight lang="csharp">
// Declaration only:
float temperature;
where item <= limit
select item;
</syntaxhighlight>
</source>
 
Типы параметров метода и возвращаемые значения задаются в сигнатуре метода. В следующей сигнатуре показан метод, который требует int в качестве входного аргумента, и который возвращает строку:
 
<sourcesyntaxhighlight lang="csharp">
public string GetName(int ID)
{
}
private string[] names = { "Spencer", "Sally", "Doug" };
</syntaxhighlight>
</source>
 
После объявления переменной она не может быть повторно объявлена с новым типом, и ей нельзя присвоить значение, несовместимое с ее объявленным типом. Например, нельзя объявить int и затем присвоить ему логическое значение true. Однако значения могут быть преобразованы в другие типы, например, при их присвоении новым переменным или при передаче в качестве аргументов метода. Преобразование типов, которое не приводит к потере данных, автоматически выполняется компилятором. Для преобразования, которое может привести к потере данных, необходимо приведение в исходном коде.
Встроенные числовые типы являются структурами, и к их свойствам и методам можно получить доступ.
 
<sourcesyntaxhighlight lang="csharp">
// Static method on type Byte.
byte b = Byte.MaxValue;
</syntaxhighlight>
</source>
 
Но значения объявляются и присваиваются им, как если бы они были простыми не статическими типами:
<sourcesyntaxhighlight lang="csharp">
byte num = 0xA;
int i = 5;
char c = 'Z';
</syntaxhighlight>
</source>
 
Типы значений являются запечатанными, что означает, например, что нельзя произвести тип от System.Int32, и нельзя определить структуру для наследования от любого пользовательского класса или структуры, поскольку структура может наследовать только от System.ValueType. Однако структура может реализовать один или несколько интерфейсов. Можно выполнить приведение типа структуры в тип интерфейса; это приведет к операции упаковки-преобразования для создания программы-оболочки структуры внутри объекта ссылочного типа в управляемой куче. Операции упаковки-преобразования возникают при передаче типа значения методу, принимающему System.Object в качестве входного параметра. Дополнительные сведения см. в разделе Упаковка-преобразование и распаковка-преобразование (Руководство по программированию на C#).
Ключевое слово struct используется для создания собственных пользовательских типов значений. Обычно структура используется как контейнер для небольшого набора связанных переменных, как показано в следующем примере:
<sourcesyntaxhighlight lang="csharp">
public enum FileMode
{
Append = 6,
}
</syntaxhighlight>
</source>
 
Значение константы System.IO.FileMode.Create равно 2. Однако имя намного более значимо для пользователей, читающих исходный код, и по этой причине лучше использовать перечисления вместо литеральных номеров констант. Дополнительные сведения см. в разделе System.IO.FileMode.
Тип, определенный как класс, делегат, массив или интерфейс, является ссылочным типом. Во время выполнения при объявлении переменной ссылочного типа переменная содержит значение null до явного создания экземпляра объекта с помощью оператора new или назначения его объекту, который был создан в другом месте, с помощью new, как показано в следующем примере:
 
<sourcesyntaxhighlight lang="csharp">
MyClass mc = new MyClass();
MyClass mc2 = mc;
</syntaxhighlight>
</source>
 
Интерфейс должен быть инициализирован вместе с объектом класса, который его реализует. Если MyClass реализует IMyInterface, то создайте экземпляр IMyInterface, как показано в следующем примере:
<sourcesyntaxhighlight lang="csharp">
IMyInterface iface = new MyClass();
</syntaxhighlight>
</source>
 
При создании объекта память размещается в управляемой куче, и переменная хранит только ссылку на расположение объекта. Для типов в управляемой куче требуются служебные данные и при их размещении, и при их удалении функциональной возможностью автоматического управления памятью среды CLR, также известной как сборка мусора. Однако сборка мусора также в высокой степени оптимизирована, и в большинстве сценариев она не создает проблем с производительностью. Дополнительные сведения о сборке мусора см. в разделе Автоматическое управление памятью.
Все массивы являются ссылочными типами, даже если их члены являются типами значений. Массивы являются неявно производными от класса System.Array, но объявляются и используются они с упрощенным синтаксисом, предоставленным C#, как показано в следующем примере:
 
<sourcesyntaxhighlight lang="csharp">
// Declare and initialize an array of integers.
int[] nums = { 1, 2, 3, 4, 5 };
// Access an instance property of System.Array.
int len = nums.Length;
</syntaxhighlight>
</source>
 
Ссылочные типы полностью поддерживают наследование. При создании класса можно наследовать от любого другого интерфейса или класса, который не определен как запечатанный, а другие классы могут наследовать от этого класса и переопределять виртуальные методы. Дополнительные сведения о создании собственных классов см. в разделе Классы и структуры (Руководство по программированию в C#). Дополнительные сведения о наследовании и виртуальных методах см. в разделе Наследование (Руководство по программированию на C#).
 
Поскольку литералы являются типизированными и все типы в конечном счете являются производными от System.Object, можно записать и скомпилировать код, например, следующий:
<sourcesyntaxhighlight lang="csharp">
string s = "The answer is " + 5.ToString();
// Outputs: "The answer is 5"
// Outputs: "System.Int32"
Console.WriteLine(type);
</syntaxhighlight>
</source>
== Универсальные типы ==
 
583

правки

Навигация