* При перепечатке материалов ссылка на www.SeoLiga.ru обязательна!
Преобразование типов
7 февраля 2009
Время от времени требуется преобразовывать одни типы в другие. Подобное пре- образование можно выполнить неявно, то есть автоматически, или явно, когда про- граммист самостоятельно запрашивает преобразование типов.
Неявное преобразование Неявное преобразование типов выполняется автоматически, если только оно не ведет к потере данных, например: Visual Basic .NET Dim anlnteger As Integer = 100 Dim along As Long ' Поскольку тип long способен принять любое значение типа integer, потери данных не будет, along = anlnteger Visual C# int Anlnteger = 100; long along; // Поскольку тип long способен принять любое // значение типа integer, потери данных не будет. along = anlnteger; Если один тип разрешается неявно преобразован в другой, его всегда можно ис- пользовать вместо второго типа, скажем, при вызове методов, причем для этого не нужен никакой особый синтаксис: Visual Basic .NET 1 Предполагается, что методу TakesADouble требуется параметр типа Double. Dim I As Integer = 100 1 Перед вызовом переменная I неявно 1 преобразуется в Double и передается методу, TakesADouble(I) Visual C# // Предполагается, что методу TakesADouble требуется параметр типа Double, int I = 100; // Перед вызовом переменная I неявно // преобразуется в Double и передается методу. TakesAdouble(I); Неявные преобразования, которые поддерживаются в Visual Basic .NET и в Visual С#, перечислены в таблице 3-3. Таблица 3-3. Неявные преобразования типов, допустимые в Visual Basic .NET и Visual C# Исходный тип Целевой тип Byte (Visual Basic .NET) Short, Integer, Long, Single, Double, Decimal byte (Visual C#) short, ushort, int, uint, long, ulong, float, double, decimal Short Integer, Long, Single, Double, Decimal short int, long, float, double, decimal Integer Long, Single, Double, Decimal int long, float, double, decimal Long Single, Double, Decimal long float, double, decimal Single Double float Double Char Integer, Long, Single, Double, Decimal char Int, uint, long, ulong, float, double, decimal sbyte (только в Visual C#) short, int, long, float, double, decimal ushort (только в Visual C#) int, uint, long, ulong, float, double, decimal uint (только в Visual C#) long, ulong, float, double, decimal ulong (только в Visual C#) float, double, decimal Явное преобразование Если требуемое преобразование нельзя выполнить неявно, необходимо сделать это явно. Такое преобразование называется приведением (cast) типов. Для явного пре- образования в Visual Basic .NET служит функция СТуре, а в Visual C# для этого при- меняется специальный синтаксис, например: Visual Basic .NET Dim aLong As Long = 1000 Dim anlnteger As Integer anlnteger - CType(aLong, Integer) Visual C# long along - 1000; int anlnteger; anlnteger = (int)aLong; Однако явное преобразование таит иногда риск ошибок. В предыдущем приме- ре приведение типов выполняется без проблем, поскольку типы Long и Integer спо- собны принять значение 1000. А теперь рассмотрим такой пример: Visual Basic .NET Dim anlnteger As Integer - 100000 Dim aShort As Short aShort = CType(anInteger, Short) Visual C# int anlnteger = 100000; short aShort; aShort - (short)anlnteger; При компиляции и исполнении этого примера ошибок не возникает, но при проверке значения переменной aShort она окажется равной —31072. Максимально возможное значение aShort меньше значения переменной, которую пытаются к ней привести, преобразование в результате выполняется некорректно, и переменная получает неожиданное значение (—31072). Примечание Поскольку явное преобразование по своей природе небезопасно, сле- дует применить его только при крайней необходимости и предусмотреть обработку последствий некорректного преобразования. Параметр Strict в Visual Basic .NET В Visual Basic .NET поддерживается параметр Option Strict. Он включает строгую проверку типов, допускающую только преобразования типов без потери данных. Если этот параметр отключен, строгая проверка типов не выполняется, и все пре- образования осуществляются неявно. По умолчанию этот параметр отключен, что- бы активизировать его, необходимо в самом начале кода поместить ключевое слово Option, например, так: Visual Basic .NET Option Strict On Отключение параметра Option Strict возможно лишь для преемственной совмес- тимости с прежними версиями Visual Basic. Следует писать программы с парамет- ром Option Strict, установленным в On. Это позволит «отловить» на стадии компи- ляции многие ошибки, которые очень трудно отследить во время выполнения. ^ Преобразование типов 1. Если преобразование выполняется без потери данных, оно осуществляется не- явно, явное приведение типов в этом случае не требуется. 2. Если преобразование типов чревато потерей данных, необходимо выполнить его явно. В Visual Basic .NET для этого применяется функция СТуре, а в Visual C# — специальный синтаксис.