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

Содержимое удалено Содержимое добавлено
Строка 113:
Значение константы System.IO.FileMode.Create равно 2. Однако имя намного более значимо для пользователей, читающих исходный код, и по этой причине лучше использовать перечисления вместо литеральных номеров констант. Дополнительные сведения см. в разделе System.IO.FileMode.
Все перечисления наследуются от System.Enum, который наследуется от System.ValueType. Все правила, применимые к структурам, также применяются к перечислениям. Дополнительные сведения о перечислениях см. в разделе Типы перечислений (Руководство по программированию в C#).
== Ссылочные типы ==
Тип, определенный как класс, делегат, массив или интерфейс, является ссылочным типом. Во время выполнения при объявлении переменной ссылочного типа переменная содержит значение null до явного создания экземпляра объекта с помощью оператора new или назначения его объекту, который был создан в другом месте, с помощью new, asкак shownпоказано inв theследующем following exampleпримере:.
 
<source lang="csharp">
MyClass mc = new MyClass();
MyClass mc2 = mc;
</source>
 
Интерфейс должен быть инициализирован вместе с объектом класса, который его реализует. Если MyClass реализует IMyInterface, то создайте экземпляр IMyInterface, как показано в следующем примере:
<source lang="csharp">
IMyInterface iface = new MyClass();
</source>
 
При создании объекта память размещается в управляемой куче, и переменная хранит только ссылку на расположение объекта. Для типов в управляемой куче требуются служебные данные и при их размещении, и при их удалении функциональной возможностью автоматического управления памятью среды CLR, также известной как сборка мусора. Однако сборка мусора также в высокой степени оптимизирована, и в большинстве сценариев она не создает проблем с производительностью. Дополнительные сведения о сборке мусора см. в разделе Автоматическое управление памятью.
Все массивы являются ссылочными типами, даже если их члены являются типами значений. Массивы являются неявно производными от класса System.Array, но объявляются и используются они с упрощенным синтаксисом, предоставленным C#, как показано в следующем примере:
 
<source lang="csharp">
// Declare and initialize an array of integers.
int[] nums = { 1, 2, 3, 4, 5 };
Строка 128 ⟶ 135 :
// Access an instance property of System.Array.
int len = nums.Length;
</source>
 
 
Ссылочные типы полностью поддерживают наследование. При создании класса можно наследовать от любого другого интерфейса или класса, который не определен как запечатанный, а другие классы могут наследовать от этого класса и переопределять виртуальные методы. Дополнительные сведения о создании собственных классов см. в разделе Классы и структуры (Руководство по программированию в C#). Дополнительные сведения о наследовании и виртуальных методах см. в разделе Наследование (Руководство по программированию на C#).
==Типы литеральных значений ==
 
________________________________________
В C# литеральные значения получают тип от компилятора. Можно задать, как числовой литерал должен быть типизирован, путем добавления буквы в конце номера. Например, чтобы задать, что значение 4,56 должно обрабатываться как число с плавающей запятой, добавьте после номера "f" или "F": 4.56f. При отсутствии добавленной буквы компилятор определит тип для литерала. Дополнительные сведения о том, какие типы могут быть заданы с буквенными суффиксами, см. на страницах справочника для отдельных типов в разделе Типы значений (Справочник по C#).
 
Поскольку литералы являются типизированными и все типы в конечном счете являются производными от System.Object, можно записать и скомпилировать код, например, следующий:
<source lang="csharp">
string s = "The answer is " + 5.ToString();
// Outputs: "The answer is 5"
Строка 142 ⟶ 151 :
// Outputs: "System.Int32"
Console.WriteLine(type);
</source>
== Универсальные типы ==
 
Универсальные типы
________________________________________
Тип может быть объявлен с одним или несколькими параметрами типа, служащими в качестве местозаполнителя для фактического типа (устойчивого типа), который клиентский код предоставит при создании экземпляра типа. Такие типы называются универсальными типами. Например, тип платформы .NET Framework System.Collections.Generic.List<T> имеет один параметр типа, которому в соответствии с соглашением предоставлено имя T. При создании экземпляра типа необходимо задать тип объектов, которые будут содержаться в списке, например, строку:
List<string> strings = new List<string>();
 
Использование параметра типа делает возможным повторное использование этого же класса для хранения любого типа элемента, не преобразовывая каждый элемент в объект. Универсальные классы коллекции называются строго типизированными коллекциями, поскольку компилятор знает определенный тип элементов коллекции и может вызвать ошибку во время компиляции, если, к примеру, будет произведена попытка добавить целое число к объекту strings в предыдущем примере. Дополнительные сведения см. в разделе Универсальные шаблоны (Руководство по программированию на C#).
== Неявные типы, анонимные типы и типы, допускающие значение NULL ==
 
________________________________________
Как уже говорилось ранее, можно неявно типизировать локальную переменную (но не члены класса) с помощью ключевого слова var. Переменная все же получает тип во время компиляции, но тип предоставляется компилятором. Дополнительные сведения см. в разделе Неявно типизированные локальные переменные (Руководство по программированию в C#).
 
В некоторых случаях неудобно создавать именованный тип для простых наборов связанных значений, которые не будут сохранены или переданы за пределы метода. Для этой цели можно создать анонимные типы. Дополнительные сведения см. в разделе Анонимные типы (Руководство по программированию в C#).
 
Обычные типы значений не могут иметь значение null. Однако можно создать типы значений, допускающие значение NULL, путем привязки ? после типа. Например, int? является типом int, который также может иметь значение null. В CTS типы, допускающие значения NULL, являются экземплярами универсального типа структуры System.Nullable<T>. Типы, допускающие значение NULL, особенно полезны при передаче данных в базы данных и из них, в которых числовые значение могут быть равны NULL. Дополнительные сведения см. в разделе Типы, допускающие значения NULL (Руководство по программированию на C#).