Заглавная страница Избранные статьи Случайная статья Познавательные статьи Новые добавления Обратная связь FAQ Написать работу КАТЕГОРИИ: АрхеологияБиология Генетика География Информатика История Логика Маркетинг Математика Менеджмент Механика Педагогика Религия Социология Технологии Физика Философия Финансы Химия Экология ТОП 10 на сайте Приготовление дезинфицирующих растворов различной концентрацииТехника нижней прямой подачи мяча. Франко-прусская война (причины и последствия) Организация работы процедурного кабинета Смысловое и механическое запоминание, их место и роль в усвоении знаний Коммуникативные барьеры и пути их преодоления Обработка изделий медицинского назначения многократного применения Образцы текста публицистического стиля Четыре типа изменения баланса Задачи с ответами для Всероссийской олимпиады по праву Мы поможем в написании ваших работ! ЗНАЕТЕ ЛИ ВЫ?
Влияние общества на человека
Приготовление дезинфицирующих растворов различной концентрации Практические работы по географии для 6 класса Организация работы процедурного кабинета Изменения в неживой природе осенью Уборка процедурного кабинета Сольфеджио. Все правила по сольфеджио Балочные системы. Определение реакций опор и моментов защемления |
Управляющие последовательности символовСодержание книги
Поиск на нашем сайте
Большинство печатаемых символов достаточно заключить в одинарные кавычки, но набор в текстовом редакторе некоторых символов, например возврата каретки, вызывает особые трудности. Кроме того, ряд других символов, в том числе одинарные и двойные кавычки, имеют специальное назначение в С#, поэтому их нельзя использовать непосредственно. По этим причинам в С# предусмотрены специальные управляющие последовательности символов:
Строковые литералы
В С# поддерживается еще один тип литералов — строковый. Строковый литерал представляет собой набор символов, заключенных в двойные кавычки. Например, следующий фрагмент кода:
"Это текст"
Помимо обычных символов, строковый литерал может содержать одну или несколько управляющих последовательностей символов, о которых речь шла выше. Также можно указать буквальный строковый литерал. Такой литерал начинается с символа после которого следует строка в кавычках. Содержимое строки в кавычках воспринимается без изменений и может быть расширено до двух и более строк. Это означает, что в буквальный строковый литерал можно включить символы новой строки, табуляции и прочие, не прибегая к управляющим последовательностям. Единственное исключение составляют двойные кавычки «"», для указания которых необходимо использовать две двойные кавычки подряд «" "». Пример:
using System; using System.Collections.Generic; using System.Linq; using System.Text;
namespace LC_Console { class Program { static void Main(string[] args) { // Используем перенос строки Console.WriteLine("Первая строка\nВторая строка\nТретья строка\n"); // Используем вертикальную табуляцию Console.WriteLine(" Первый столбец \v Второй столбец \v Третий столбец \n"); // Используем горизонтальную табуляцию Console.WriteLine("1\t2\t3"); Console.WriteLine("Четыре\tПять\tШесть\n"); //Вставляем кавычки Console.WriteLine("\"Зачем?\", - спросил он"); Console.WriteLine("Для продолжения нажмите любую клавишу... "); Console.ReadKey(); } } } /* Выведет: * Первая строка * Вторая строка * Третья строка * * Первый столбец | Второй столбец | Третий столбец * * 1 2 3 * Четыре Пять Шесть * * "Зачем?, - спросил он * Для продолжения нажмите любую клавишу... */ 3.4.6. Преобразование типов данных Преобразование типов данных
1. Виды преобразования типов данных
Поскольку в C# тип определяется статически тип во время компиляции, после объявления переменной, она не может быть объявлена вновь или использоваться для хранения значений другого типа, если этот тип не преобразуется в тип переменной. Например, невозможно преобразование из целого числа в произвольную строку. Поэтому после объявления переменной i как целочисленной, нельзя ей присвоить строку «Hello», как показано в следующем коде:
int i; i = "Hello"; // Неявное преобразование типа "string" в "int" (ошибка)
Но иногда может быть необходимым скопировать значение в переменную или параметр метода другого типа. Например, может быть переменная, которую требуется передать методу, параметр которого имеет тип double. Или может понадобиться присвоить переменную класса переменной типа интерфейса.Операции такого вида называются преобразованиями типов. В C# можно выполнять следующие виды преобразований:
2.Неявные преобразования
Для встроенных числовых типов неявное преобразование можно выполнить, сохраняемое значение может уместиться в переменной без обрезания или округления до ближайшего. Например, переменная типа long (8-байтное целое) может хранить любое значение, которое может хранить int (4 байта в 32-разрядном компьютере). В следующем примере компилятор неявно преобразует значение справа в тип long перед присвоением его типу bigNum.
int num = 2147483647; long bigNum = num;
Для ссылочных типов всегда существует неявное преобразование из класса в любой из его прямых или косвенных базовых классов или интерфейсов. Никакого специального синтаксиса не требуется, поскольку производный класс всегда содержит все члены базового класса:
Derived d = new Derived(); Base b = d; // OK
3. Явные преобразования
Однако если преобразование не может быть выполнено без риска потери данных, для компилятора требуется, чтобы пользователь выполнил явное преобразование, которое называется приведением. Приведение является способом явно указать компилятору, что нужно сделать преобразование, и что известно, что может быть потеря данных. Для выполнения приведения заключите тип, в который производится приведение, в скобки перед преобразуемым значением или переменной. Следующая программа выполняет приведение типа double к типу int. Без приведения эта программа скомпилирована не будет:
using System; using System.Collections.Generic; using System.Linq; using System.Text;
namespace LC_Console { class Program { static void Main(string[] args) { double x = 1234.7; int a; a = (int)x; Console.WriteLine(a); Console.WriteLine("Для продолжения нажмите любую клавишу... "); Console.ReadKey(); } } } /* Выведет: * 1234 * Для продолжения нажмите любую клавишу... */
Для ссылочных типов явное приведение необходимо, если нужно выполнить преобразование из базового типа в производный тип: Giraffe g = new Giraffe(); Animal a = g; // Явное преобразование требуется перейти к производному типу. // Примечание: Этот код откомпилируется, но выдает исключение во время выполнения, // если с правой стороны объекта на самом деле не "жираф". Giraffe g2 = (Giraffe)a;
Операция приведения между ссылочными типами не меняет тип времени выполнения базового объекта; меняется только тип значения, которое используется в качестве ссылки на этот объект.
Дополнительные сведения
В программировании нередко значения переменных одного типа присваиваются переменным другого типа. Например, в приведённом ниже фрагменте кода целое значение типа int присваивается переменной с плавающей точкой типа float: int i; float f; i = 10; f = i; // Присвоить целое значение переменной типа float
Если в одной операции присваивания смешиваются совместимые типы данных, то значение в правой части оператора присваивания автоматически преобразуется в тип, указанный в левой его части. Поэтому в приведенном выше фрагменте кода значение переменной i сначала преобразуется в тип float, а затем присваивается переменной f. Но вследствие строгого контроля типов далеко не все типы данных в С# оказываются полностью совместимыми, а следовательно, не все преобразования типов разрешены в неявном виде. Например, типы bool и int несовместимы. Правда, преобразование несовместимых типов все-таки может быть осуществлено путём приведения. Приведение типов, по существу, означает явное их преобразование. 4. Автоматическое преобразование типов
Когда данные одного типа присваиваются переменной другого типа, неявное преобразование типов происходит автоматически при следующих условиях:
Если оба эти условия удовлетворяются, то происходит расширяющее преобразование. Например, тип int достаточно крупный, чтобы вмещать в себя все действительные значения типа byte, а кроме того, оба типа, int и byte, являются совместимыми целочисленными типами, и поэтому для них вполне возможно неявное преобразование. Числовые типы, как целочисленные, так и с плавающей точкой, вполне совместимы друг с другом для выполнения расширяющих преобразований. Рассмотрим пример:
using System; using System.Collections.Generic; using System.Linq; using System.Text;
namespace LC_Console { class Program { static void Main(string[] args) { short num1, num2; num1 = 10; num2 = 15; Console.WriteLine("{0} + {1} = {2}",num1, num2, Sum(num1, num2)); Console.WriteLine("Для продолжения нажмите любую клавишу... "); Console.ReadKey(); }
static int Sum(int x, int y) { return x + y; } } } /* Выведет: * 10 + 15 = 25 * Для продолжения нажмите любую клавишу... */
Обратим внимание на то, что метод Sum ожидает поступления двух параметров типа int. Тем не менее, в методе Main ему на самом деле передаются две переменных типа short. Хотя это может показаться несоответствием типов, программа будет компилироваться и выполняться без ошибок и возвращать в результате, как и ожидалось, значение 25. Причина, по которой компилятор будет считать данный код синтаксически корректным, связана с тем, что потеря данных здесь невозможна. Поскольку максимальное значение (32767), которое может содержать тип short, вполне вписывается в рамки диапазона типа int (максимальное значение которого составляет 2147483647), компилятор будет неявным образом расширять каждую переменную типа short до типа int. Формально термин «расширение» применяется для обозначения неявного восходящего приведения (upward cast), которое не приводит к потере данных.
|
||||||||||||||||||||||||||||
Последнее изменение этой страницы: 2016-12-28; просмотров: 329; Нарушение авторского права страницы; Мы поможем в написании вашей работы! infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 3.145.199.240 (0.009 с.) |