Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

Русский_Проект: Изучение Visual Basic C#. Учебный курс


C#. Учебный курс

Здравствуйте, программисты! Сегодня у нас восьмое занятие, в котором мы продолжим разговор о типах для целых чисел, а также познакомимся с управляющим оператором if.

Целые числа в .NET Framework

Надо сказать, что структуры SByte, UInt16, UInt32, UInt64, о которых говорилось на прошлом занятии, не поддерживаются CLS. Поэтому, если вы будете писать код, который будет использоваться другими языками программирования, то лучше избегать применения подобных структур.

То, что тип int является псевдонимом струкутры System.Int32, позволяет использовать некоторые методы и свойства. Например, у структуры System.Int32 есть такие удобные свойства, как MinValue и MaxValue, которые содержат минимальное и максимальное допустимое значение для типа int. Аналогичные свойства имеются и остальных типов. Вот небольшая программа, которая демонстрирует этот пример:

// Минимальные и максимальные допустимые значения для различных типов

using System;

class MinMaxDemo
{
    public static void Main()
    {       
        Console.WriteLine(sbyte.MinValue);
        Console.WriteLine(sbyte.MaxValue);
        Console.WriteLine();

        Console.WriteLine(byte.MinValue);
        Console.WriteLine(byte.MaxValue);       
        Console.WriteLine();
        
        Console.WriteLine(short.MinValue);
        Console.WriteLine(short.MaxValue);
        Console.WriteLine();
        
        Console.WriteLine(ushort.MinValue);
        Console.WriteLine(ushort.MaxValue);
        Console.WriteLine();
        
        Console.WriteLine(int.MinValue);
        Console.WriteLine(int.MaxValue);
        Console.WriteLine();
        
        // и так далее                                                   
     }
}

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

Считается, что любой целочисленный литерал относится к типу int. Если число слишком большое для типа int, то оно относится к типу uint. Если оно слишком большое для uint, то оно относится к типу long. Если оно слишком большое для long, то оно относится к типу ulong. Но, предположим вы используете переменную со значением 5 и хотите, чтобы эта переменная имела тип ulong. Тогда вам надо к числу добавить символ u или U:

a = 5U;

Аналогично, можно использовать символы l или L, чтобы компилятор трактовал число, как long:

a = 6L;

Также можно записать число в шестнадцатиричном виде. Для этого используется префикс 0x или 0X и далее записывается само число в шестнадцатиричном формате:

c = 0x3FA;

Преобразование типов

Допустим, мы объявили две переменные двух типов для последующего сложения:

ushort x = 43888;
int y = 102;

int a = x + y;

Все численные операции допустимы только между числами одного типа. Поэтому C# автоматически конвертирует тип ushort в тип int перед сложением. Подобное преобразование называется неявным и происходит без участия программиста. C# способен неявно преобразовать ushort в int, так как тип int может содержать все значения типа ushort. Аналогично происходит с другими типами: byte можно неявно конвертировать в любой 16-разрядный и выше целый тип и так далее.

Если выражение сложное и включает в себя множество операторов, то C# выполняет преобразование оператор за оператором, руководствуюясь правилом старшинства. Запомните, что приведение предшествует реальному выполнению операции.

Если выполняется операция между типами int и uint, то C# неявно преобразует каждое число к типу long, так как этот тип способен хранить все возможные значения int и uint. У вас не получится присвоить результат сложения чисел int и uint другому типу int или uint. Попробуем написать такую программу:

int a = 45;
uint t = 2000;

int c = a + t;

Если вы попытаетесь запустить программу с этим кодом, то компилятор выдаст следующее предупреждение: Cannot implicity convert type 'long' to 'int'. An explicit conversion exists (are you missing a cast?), что переводится как Невозможно неявно преобразовать тип 'long' в 'int'.

Этот код не работает, так как мы пытаемся присвоить значение типа long переменной типа int. C# не может неявно привести тип long к типу int, так как int не может хранить все значения, допустимые в long.

C# не допустит операцию между типами long и ulong, потому что не существует целого типа, который способен сохранить все множество значений обоих типов long и ulong. Проверьте это самостоятельно.

Кроме неявного приведения, существует еще явное приведение. Для этого нужно указать в скобках нужный тип данных и разместить это выражение перед переменной, которые вы хотите преобразовать. Вспомним один из предыдущих примеров и перепишем его:

int a = 45;
uint t = 2000;

int c = a + (int) t;  // теперь все работает

В этом примере тип uint приводится к типу int, далее выполняется сложение между числами одного типа и результат относится тоже к этому типу. Все работает.

Учтите, что при явном приведении могут теряться биты. Например, если вы явно приведете тип int к byte, то все биты, кроме младших 8, будут просто отброшены:

byte a = 5;
int t = 2549;

int c = a + (byte)t; // получится 250

Явное приведение очень мощный инструмент, но им очень легко злоупотребить. Постарайтесь в своих программах делать это обдуманно.

Управляющие операторы

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

Оператор if

Условный оператор if часто применяется в программировании. Существует несколько вариантов использования данного оператора. В С# конструкция if/else работает только с логическими выражениями (true и false). Самая простая форма выглядит так:

if (условие) оператор;  // если условие истинно, то выполняется оператор

Здесь условие - это булево выражение, имеющее значение true или false. Если условие истинно, то оператор выполняется, если ложно, то оператор не выполняется. Все просто, вот пример:

if (2*2 == 5) Console.Write("Дважды два равно пяти!);

Как вы думаете, что появится на экране? Правильно, ничего, так как оператор не будет выполняться, потому что условие 2*2 == 5 является ложным.

Примечание: Обратите внимание, что оператор равенства состоит из двух символов знака равенства. Об этом часто забывают начинающие программисты.

Вот список операторов, которые можно использовать в условных выражениях:

ОператорОписание
<Меньше чем
<=Меньше или равно
>Больше чем
<=Больше или равно
==Равно
!=Не равно

Существует еще и второй вариант оператора if с использованием ключевого слова else:

if (условие) оператор;  // если условие истинно, то выполняется первый оператор
else оператор;          // если условие ложно, то выполняется оператор после else

В этом случае при выполнении условия оператора if инициируется только один оператор, если условие не выполняется, то также инициируется только один оператор, который относится к else. Также можно использовать блоки операторов, тогда синтаксис будет выглядеть так:

if (условие)
{
    оператор1;
    оператор2;
}
else
{
    оператор1;
    оператор2;
}

Условия для выражения if могут быть весьма сложными. В них часто используются операторы, представленные в таблице.

Операторы для условий в С#

Оператор С#Пример использованияНазначение
&&if ((age = = 30) && (name = = "Fred"))Соответствует логическому И (AND)
||if ((age = = 30) || (name = = "Fred"))Соответствует логическому ИЛИ (OR)
!if (!myBool)Соответствует логическому НЕ (NOT)

Visual Basic 6.0

В разделе Примеры есть библиотечка повторного кода module.zip, в которую собирается полезный код. Добавил в нее еще парочку функций, позволяющий выбрать случайный цвет типа QBColor или RGB: RandomQBColor() и RandomRGBColor(). Эти функции я подглядел на сайте Рода Стевенса

Удачного вам программирования!


©2006 А.Климов
Русский_Проект

В избранное