Главная страница
Навигация по странице:

  • Руководство по программированию на C. Приведение и преобразование типов

  • Явные преобразования (приведения)

  • Пользовательские преобразования

  • Преобразования с использованием вспомогательных классов

  • Исключения преобразования типов во время выполнения

  • Литералы и простые имена

  • Выражения запросов Аналогичные правила в общем случае применяются и к выражениям запроса. Дополнительные сведения см. в статье LINQ .Лямбда-выражения

  • Определения текста выражений

  • Выражения. Руководство по программированию в C#


    Скачать 43.07 Kb.
    НазваниеРуководство по программированию в C#
    Дата29.06.2020
    Размер43.07 Kb.
    Формат файлаdocx
    Имя файлаВыражения.docx
    ТипРуководство
    #61750

    Подборка по базе: Пошаговое руководство по расчету легкого самолета.pdf, Практич. руководство Острые отравления клофелином у больных пожи

    Выражения (Руководство по программированию в C#)

    Выражение представляет собой последовательность из одного или нескольких операндов и от нуля до нескольких операторов, которую можно вычислить, получив в результате одно значение, объект, метод или пространство имен. Выражение может состоять из литерала, вызова метода, оператора или его операндов, а также из простого имени. Простые имена могут быть именами переменной, элемента типа, параметра метода, пространства имен или типа.

    В выражениях могут использоваться операторы, которые, в свою очередь, используют в качестве параметров другие выражения или вызовы методов, параметрами которых являются другие вызовы методов. Таким образом, выражения могут быть как простыми, так и очень сложными. Ниже приведено два примера выражений.

    ((x < 10) && ( x > 5)) || ((x > 20) && (x < 25));
    System.Convert.ToInt32("35");

    Значения выражений

    В большинстве контекстов, в которых используются выражения, например, в операторах или в параметрах методов, предполагается, что результатом вычисления выражения будет какое-то значение. Если x и y — целые числа, результатом вычисления выражения x + y будет числовое значение. Результатом вычисления выражения new MyClass() будет ссылка на новый экземпляр класса MyClass. Результатом вычисления выражения myClass.ToString() является строка, так как она является возвращаемым типом метода. Однако хотя имя пространства имен классифицируется как выражение, значение не будет результатом его вычисления и поэтому никогда не станет конечным результатом какого-либо выражения. Имя пространства имен нельзя передать параметру метода, или использовать его в новом выражении, или присвоить его переменной. Его можно использовать только как часть выражения в более крупном выражении. Это также относится к типам (в отличие от объектов System.Type), именам групп методов (в отличие от отдельных методов) и к методам доступа к событиям add и remove.

    У каждого значения есть связанный с ним тип. Например, если x и y — переменные типа int, значение выражения x + y также типизируется как int. Если значение присвоено переменной другого типа или x и y принадлежат к разным типам, то применяются правила преобразования типов. Дополнительные сведения о работе таких преобразований см. в разделе Приведение и преобразование типов.

    Руководство по программированию на C#. Приведение и преобразование типов

    • 20.07.2015

    • Время чтения: 8 мин





     



     



     



     




    Поскольку код C# является статически типизированным во время компиляции, после объявления переменной ее нельзя объявить повторно или назначить ей значения другого типа, если этот тип невозможно неявно преобразовать в тип переменной. Например, string невозможно неявно преобразовать в int. Поэтому после объявления i как int нельзя назначить ей строку "Hello", как показано в следующем коде:

    C#Копировать

    int i;

    i = "Hello"; // error CS0029: Cannot implicitly convert type 'string' to 'int'

    Тем не менее иногда может потребоваться скопировать значение в переменную или параметр метода другого типа. Например, может потребоваться передать целочисленную переменную в метод, параметр которого имеет тип double. Или может понадобиться присвоить переменную класса переменной типа интерфейса. Такого рода операции называются преобразованиями типа. В C# можно выполнять следующие виды преобразований.

    • Неявные преобразования. Специальный синтаксис не требуется, так как преобразование является строго типизированным и данные не будут потеряны. Примеры включают преобразования из меньших в большие целочисленные типы и преобразования из производных классов в базовые классы.

    • Явные преобразования (приведения) . Для явных преобразований требуется оператор приведения (). Приведение требуется, если в ходе преобразования данные могут быть утрачены или преобразование может завершиться сбоем по другим причинам. Типичными примерами являются числовое преобразование в тип с меньшей точностью или меньшим диапазоном и преобразование экземпляра базового класса в производный класс.

    • Пользовательские преобразования. Такие преобразования выполняются специальными методами, которые можно определить для включения явных и неявных преобразований между пользовательскими типами без связи "базовый класс — производный класс". Дополнительные сведения см. в разделе Операторы пользовательского преобразования.

    • Преобразования с использованием вспомогательных классов. Чтобы выполнить преобразование между несовместимыми типами, например целыми числами и объектами System.DateTime или шестнадцатеричными строками и массивами байтов, можно использовать классы System.BitConverter и System.Convert, а также методы Parse встроенных числовых типов, такие как Int32.Parse. Дополнительные сведения см. в руководствах по преобразованию массива байтов в значение типа intпреобразованию строки в число и преобразованию из шестнадцатеричных строк в числовые типы.

    Неявные преобразования

    Для встроенных числовых типов неявное преобразование можно выполнить, если сохраняемое значение может уместиться в переменной без усечения или округления. При использовании целочисленных типов это означает, что диапазон исходного типа является надлежащим подмножеством диапазона для целевого типа. Например, переменная типа long (64-разрядное целое число) может хранить любое значение, которое может хранить переменная int (32-разрядное целое число). В следующем примере компилятор неявно преобразует значение num справа в тип long перед назначением bigNum.

    C#Копировать

    // Implicit conversion. A long can

    // hold any value an int can hold, and more!

    int num = 2147483647;

    long bigNum = num;

    Полный список всех неявных числовых преобразований см. в разделе Таблица неявных числовых преобразований в статье Встроенные числовые преобразования.

    Для ссылочных типов неявное преобразование всегда предусмотрено из класса в любой из его прямых или косвенных базовых классов или интерфейсов. Никакой специальный синтаксис не требуется, поскольку производный класс всегда содержит все члены базового класса.

    C#Копировать

    Derived d = new Derived();

    Base b = d; // Always OK.

    Явные преобразования

    Тем не менее если преобразование нельзя выполнить без риска потери данных, компилятор требует выполнения явного преобразования, которое называется приведением. Приведение — это способ явно указать компилятору, что необходимо выполнить преобразование и что вам известно, что может произойти потеря данных. Чтобы выполнить приведение, укажите тип, в который производится приведение, в круглых скобках перед преобразуемым значением или переменной. В следующей программе выполняется приведение типа double в int. Программа не будет компилироваться без приведения.

    C#Копировать

    class Test

    {

    static void Main()

    {

    double x = 1234.7;

    int a;

    // Cast double to int.

    a = (int)x;

    System.Console.WriteLine(a);

    }

    }

    // Output: 1234

    Полный список всех поддерживаемых явных числовых преобразований см. в разделе Таблица явных числовых преобразований в статье Встроенные числовые преобразования.

    Для ссылочных типов явное приведение является обязательным, если необходимо преобразовать базовый тип в производный тип:

    C#Копировать

    // Create a new derived type.

    Giraffe g = new Giraffe();



    // Implicit conversion to base type is safe.

    Animal a = g;



    // Explicit conversion is required to cast back

    // to derived type. Note: This will compile but will

    // throw an exception at run time if the right-side

    // object is not in fact a Giraffe.

    Giraffe g2 = (Giraffe) a;

    Операция приведения между ссылочными типами не меняет тип времени выполнения базового объекта; изменяется только тип значения, который используется в качестве ссылки на этот объект. Дополнительные сведения см. в разделе Полиморфизм.

    Исключения преобразования типов во время выполнения

    В некоторых преобразованиях ссылочных типов компилятор не может определить, будет ли приведение допустимым. Есть вероятность, что правильно скомпилированная операция приведения завершится сбоем во время выполнения. Как показано в следующем примере, приведение типа, завершившееся сбоем во время выполнения, вызывает исключение InvalidCastException.

    C#Копировать
    using System;
    class Animal

    {

    public void Eat() { Console.WriteLine("Eating."); }

    public override string ToString()

    {

    return "I am an animal.";

    }

    }

    class Reptile : Animal { }

    class Mammal : Animal { }
    class UnSafeCast

    {

    static void Main()

    {

    Test(new Mammal());
    // Keep the console window open in debug mode.

    Console.WriteLine("Press any key to exit.");

    Console.ReadKey();

    }
    static void Test(Animal a)

    {

    // Cause InvalidCastException at run time

    // because Mammal is not convertible to Reptile.

    Reptile r = (Reptile)a;

    }

    }

    C# предоставляет оператор is, чтобы можно было проверить совместимость перед фактическим выполнением приведения. Дополнительные сведения см. в статье Практическое руководство. Безопасное приведение с помощью сопоставления шаблонов, а также операторов is и as.

    Переполнения

    Числовые выражения могут привести к переполнениям, если значение больше максимального значения типа значения. Дополнительные сведения см. в разделах Проверяемые и непроверяемые и Явные числовые преобразования в статье Встроенные числовые преобразования.

    Приоритет и ассоциативность операторов

    Способ вычисления выражения управляется правилами ассоциативности и приоритетом операторов. Дополнительные сведения см. в разделе Операторы.

    Большинство выражений, за исключением выражений назначения и выражений вызова метода, должны быть встроены в оператор. Дополнительные сведения см. в разделе Выписки.

    Литералы и простые имена

    Двумя наиболее простыми типами выражений являются литералы и простые имена. Литерал представляет собой постоянное значение, у которого нет имени. Например, в следующем примере 5 и "Hello World" являются литералами.

    C#Копировать

    // Expression statements.

    int i = 5;

    string s = "Hello World";

    Дополнительные сведения о литералах см. в разделе Типы.

    В предыдущем примере i и s являются простыми именами, которые определяют локальные переменные. При использовании таких переменных в выражениях результатом вычисления имени переменной является значение, которое в данное время хранится в расположении переменой в памяти. Это показано в следующем примере:

    C#Копировать

    int num = 5;

    System.Console.WriteLine(num); // Output: 5

    num = 6;

    System.Console.WriteLine(num); // Output: 6

    Выражения вызова

    В следующем примере кода вызов метода DoWork является выражением вызова.

    C#Копировать

    DoWork();

    При вызове метода необходимо указать имя метода в явном виде, как было показано в предыдущем примере, или в виде результата другого выражения, после чего в скобках указываются все параметры этого метода. Дополнительные сведения см. в статье Методы. При вызове делегата указывается имя делегата и параметры метода в скобках. Дополнительные сведения см. в разделе Делегаты. Результатом вызова метода или делегата является возвращаемое методом значение, если метод вообще возвращает значение. В качестве значений в выражениях нельзя использовать методы, возвращающие значение типа void.

    Выражения запросов

    Аналогичные правила в общем случае применяются и к выражениям запроса. Дополнительные сведения см. в статье LINQ.

    Лямбда-выражения

    Лямбда-выражения представляют собой "встроенные методы", у которых нет имен, но которые могут иметь входные параметры и несколько инструкций. Они активно используются в LINQ для передачи аргументов методам. Лямбда-выражения компилируются в делегаты или в деревья выражений в зависимости от условий, при которых они используются. Дополнительные сведения см. в разделе Лямбда-выражения.

    Деревья выражений

    Деревья выражения позволяют представлять выражения в виде структур данных. Они широко используются поставщиками LINQ для преобразования выражений запросов в код, имеющий смысл в других контекстах, например в базе данных SQL. Дополнительные сведения см. в статье Деревья выражений (C#).

    Определения текста выражений

    C# поддерживает элементы, воплощающие выражение, которые позволяют указать итоговое определение текста выражения, методы, конструкторы, методы завершения, свойства и индексаторы. Дополнительные сведения см. в разделе Элементы, воплощающие выражение.

    Примечания

    Если в выражении присутствует переменная, свойство объекта или индексатор объекта, для вычисления выражения используется значение этого элемента. В C# выражение можно использовать везде, где требуется значение или объект, если результат вычисления выражения соответствует требуемому типу.

    Спецификация языка C#

    Дополнительные сведения см. в разделе о выражениях в спецификации языка C#.


    написать администратору сайта