Фирма

«Инрэко ЛАН»

Появившись на свет 5 января 2002 года, первая версия фреймворка .NET, по заявлениям компании Microsoft, должна была стать программной платформой для написания приложений, которые можно было бы переносить с одной операционной системы (ОС) на другую без перекомпиляции. Также Microsoft предусмотрела возможность совместимости компонентов программы, которые были бы написаны на различных языках программирования. Например, основное приложение написано на языке C#, а подключаемые модули на C++ и Visual Basic. Со временем создатели .NET, осознав непомерную амбициозность некоторых своих заявлений, отказались от поддержки различных ОС, сосредоточив внимание на родном для себя семействе ОС Windows.

По всем канонам хорошей мыльной оперы образовались два лагеря − сторонники и противники технологии, которую предложила Microsoft. Одни утверждали, что со временем .NET поработит землю, другие, со скепсисом в голосе, говорили об отсутствии какого бы то ни было будущего у этой затеи. Время всё расставило на свои места и на сегодняшний день пациент скорее жив, чем мертв, представляя из себя инструмент, который в умелых руках позволяет сделать много интересного. :-)

И вот, спустя 8 лет с момента своего появления, 12 апреля 2010 года (интересное совпадение, не правда ли?) стартовала новая, четвертая по счету, версия .NET Framework. Интересно взглянуть на список новшеств в проекции на разработку прикладного программного обеспечения. Выберу несколько, наиболее интересных, на мой взгляд, нововведений.

BigInteger

Структура, которая является сложным целочисленным типом и поддерживает неограниченно большие (теоретически) целочисленные значения. Находится в сборке System.Numerics.dll, namespace одноимённый − System.Numerics. В отличие от примитивных целочисленных (Byte, Int32 и др.), BigInteger не имеет свойств MinValue/MaxValue, которые определяют нижнюю и верхнюю границы возможных значений, из чего следует, что значением может быть любое (вообще любое!) целочисленное. Также для таких неограниченно больших значений определены все операции, которые можно совершать над обычными, примитивными целочисленными типами. Некоторые, возможно, помнят, как делали нечто похожее на лабораторных работах, когда учились.

Пример:

var bInt = new BigInteger();
Console.WriteLine(bInt);
bInt = 9999999999999999999;
Console.WriteLine(bInt);
Console.WriteLine(BigInteger.Parse("-123456789012345678901234567890"));
bInt = BigInteger.Parse("0F", NumberStyles.HexNumber);
Console.WriteLine(bInt);
Console.WriteLine(bInt * 2);
Console.WriteLine(BigInteger.Multiply(bInt, 10));
Console.WriteLine(BigInteger.Negate(bInt));
Console.WriteLine(new BigInteger(new byte[] {0,4}));

Tuple

Tuple (кортеж) − в контексте .NET это структура данных с определенным количеством значений и заданным порядком следования для этих значений. Например, класс Tuple<int, string> представляет собой кортеж из двух компонентов (или пару, аналог − KeyValuePair<int, string>). Первый компонент целочисленное значение, второй − строка. По аналогии, можно использовать кортежи с количеством компонентов от 1 до 8 (на самом деле можно и больше 8). Довольно полезное нововведение, на практике часто возникают ситуации, когда использование кортежей поможет избавить от написания отдельных классов-обёрток со своим, уникальным, набором данных для каждого, отдельно взятого случая. Помимо маппинга данных из БД, котрежи могут быть очень полезны непосредственно при написании кода: нет необходимости использовать выходные параметры (out) в методах, которые возвращают несколько значений, взамен можно использовать кортеж; можно передавать несколько значений в методы, которые имеют один входной параметр типа object (например, BackgroundWorker.RunWorkerAsync(object)). В целом, котрежи избавляют от необходимости писать классы-обёртки. Ниже приведены несколько примеров, показывающие использование кортежей в .NET:

  • работа с данными − без кортежа пришлось бы создать дополнительный класс с соответствующими полями и применить к нему ту же логику, что и для кортежа;
    // ID, Login, E-mail, IsAdministrator
    var userList = new List<Tuple<int, string, string, bool>>
    {
    Tuple.Create(1, "admin", "Этот адрес электронной почты защищён от спам-ботов. У вас должен быть включен JavaScript для просмотра.", true),
    Tuple.Create(2, "kim", "Этот адрес электронной почты защищён от спам-ботов. У вас должен быть включен JavaScript для просмотра.", false),
    Tuple.Create(3, "xxx", "Этот адрес электронной почты защищён от спам-ботов. У вас должен быть включен JavaScript для просмотра.", false)
    };
    Console.WriteLine("Number of admins: {0}", userList.Count(user => user.Item4));
  • передача нескольких значений методу, который имеет только один входной параметр − опять же, без использования кортежа пришлось бы прибегнуть к помощи специального класса-обёртки;
    var bw = new BackgroundWorker();
    bw.DoWork += (o, e) =>
    {
    var tuple = e.Argument as Tuple<string, string, string>;
    if (tuple != null)
    {
    Console.WriteLine("Values passed:");
    Console.WriteLine(tuple.Item1);
    Console.WriteLine(tuple.Item2);
    Console.WriteLine(tuple.Item3);
    }
    };
    bw.RunWorkerAsync(Tuple.Create("Hello!", "Tuple is cool!", "I'am third value!"));
  • использование кортежа для возврата двух значений − и в данном случае без кортежа пришлось бы возвращать часть результата через выходные параметры или использовать класс-обёртку для результата (в приведенном примере подошел бы и класс KeyValuePair<int, int>);
    public static Tuple<int, int> SplitDecimal(decimal value)
    
    {
    return Tuple.Create(
    Convert.ToInt32(Math.Truncate(value)),
    Convert.ToInt32((value - Math.Truncate(value)) * 100));
    }

    var dValue = 11.99M;
    var tuple = SplitDecimal(dValue);
    Console.WriteLine("Source value: {0}", dValue);
    Console.WriteLine("Integer Part: {0}", tuple.Item1);
    Console.WriteLine("Fraction: {0}", tuple.Item2);

Как видно из приведенных выше примеров, котрежи в ряде случаев могут существенно упростить жизнь разработчикам. Но и тут есть небольшое неудобство − после создания кортежа его поля именуются как Item1,...,Item8, что может послужить поводом для неразберихи. Вопрос, в данном случае, решается подробным описанием в комментариях каждого из компонентов кортежа.

Продолжение следует...

Метки: .NET Framework 4 | C# | Microsoft | новые возможности

Добавить комментарий