Console.WriteLine("Отлично! C# – это прекрасный язык.");
break;
case 2:
Console.WriteLine("VB .NET: ООП, многозадачность и т.д.!");
break;
default:
Console.WriteLine("Хорошо… удачи вам с таким выбором!");
break;
}
}
Замечание. В C# требуется, чтобы каждый вариант выбора (включая default), содержащий выполняемые операторы, завершался оператором break или goto, во избежание прохода сквозь структуру при невыполнении условия.
Приятной особенностью оператора switch в C# является то, что в рамках этого оператора вы можете оценивать не только числовые, но и строковые данные. Именно это используется в следующем операторе switch (при таком подходе нет необходимости переводить пользовательские данные в числовые значения).
static void Main(string[] args) {
Console.WriteLine("C# или VB");
Console.Write("Выберите язык, который вы предпочитаете: ");
string langChoice = Console.ReadLine;
switch (langChoice) {
case "C#":
Console.WriteLine("Отлично! C# – это прекрасный язык. ");
break;
case "VB":
Console.WriteLine("VB .NET: ООП, многозадачность и т.д.!");
break;
default:
Console.WriteLine("Хорошо… удачи вам с таким выбором!");
break;
}
}
Исходный код
Типы, характеризуемые значениями, и ссылочные типы
Подобно любому другому языку программирования, язык C# определяет ряд ключевых слов, представляющих базовые типы данных, такие как целые числа, символьные данные, числа с плавающим десятичным разделителем и логические (булевы) значения. Если вы работали с языком C++, то будете рады узнать, что здесь эти внутренние типы являются "фиксированными константами", т.е., например, после создания элемента целочисленных данных все языки .NET будут понимать природу этого типа и диапазон его значений,
Тип данных .NET может либо характеризоваться значением, либо быть ссылочным типом (т.е. характеризоваться ссылкой). К типам, характеризуемым значением, относятся все числовые типы данных (int, float и т.д.), а также перечни и структуры, размещаемые в
// Целочисленные данные характеризуются значением!
public void SomeMethod {
int i = 0;
Console.WriteLine(i);
} // здесь
Когда вы присваиваете один характеризуемый значением тип другому, по умолчанию выполняется "почленное" копирование. Для числовых и булевых типов данных единственным "членом", подлежащим копированию, является непосредственное значение переменной,
// Для типов, характеризуемых значениями, в результате такого
// присваивания в стек помещаются две независимые переменные.
public void SomeMethod {
int i = 99;
int j = i;
// После следующего присваивания значением 'i' останется 99.
j = 8732;
}
Этот пример может не содержать для вас ничего нового, но важно понять, что .NET-структуры (как и перечни, которые будут рассмотрены в этой главе позже) тоже являются типами, характеризуемыми значением. Структуры, в частности, дают возможность использовать основные преимущества объектно-ориентированного подхода (инкапсуляции) при сохранении эффективности размещения данных в стеке. Подобно классам, структуры могут использовать конструкторы (с аргументами) и определять любое число членов.
Все структуры неявно получаются из класса System.ValueType. С точки зрения функциональности, единственной целью System.ValueType является "переопределение" виртуальных методов System.Object (этот объект будет описан чуть позже) с целью учета особенностей семантики типов, заданных значениями, в противоположность ссылочным типам. Методы экземпляра, определенные с помощью System.ValueType, будут идентичны соответствующим методам System.Object.
// Структуры и перечни являются расширениями System.ValueType.
public abstract class ValueType: object {