SlideShare ist ein Scribd-Unternehmen logo
1 von 8
Downloaden Sie, um offline zu lesen
О сложностях программирования, или
C# нас не спасет?
Автор: Евгений Рыжков

Дата: 26.10.2010

Программирование это сложно. С этим никто, надеюсь, не спорит. Но вот тема новых языков
программирования, а точнее поиск "серебряной пули" всегда находит бурных отклик в умах
разработчиков программного обеспечения. Особенно "модной" является тема превосходства
одного языка программирования над другим. Ну, к примеру, что C# "круче", чем C++. И хотя holy
wars – это не та причина, по которой я пишу этот пост, тем не менее, что называется "наболело".
Ну не поможет C#/lisp/F#/Haskell/... написать изящное приложение, взаимодействующее с
внешним миром, и все тут. Вся изящность теряется, стоит захотеть написать что-то реальное, а не
пример "сам в себе".

В тексте несколько фрагментов на C#, взятые из модуля интеграции статического анализатора
кода PVS-Studio в популярную среду Microsoft Visual Studio. Этими фрагментами я хочу показать,
что писать, к примеру, на C# совсем не проще, чем на, C++.


Простой combobox
Этак, первый фрагмент кода – обработка выбора одной из трех строк в ОБЫЧНОМ combobox на
панели инструментов с картинки.




Рисунок 1 – Простой combobox на три строчки

И вот для обработки такой вот фитюльки требуется следующий код. К сожалению, пришлось
изменить форматирование и убрать комментарии. Так что прошу прощения за ужас.

private void OnMenuMyDropDownCombo(object sender, EventArgs e)

{

    if (e == EventArgs.Empty)

    {

        throw (new ArgumentException());
}



OleMenuCmdEventArgs eventArgs = e as OleMenuCmdEventArgs;



if (eventArgs != null)

{

    string newChoice = eventArgs.InValue as string;

    IntPtr vOut = eventArgs.OutValue;



    if (vOut != IntPtr.Zero && newChoice != null)

    {

        throw (new ArgumentException());

    }

    else if (vOut != IntPtr.Zero)

    {

        Marshal.GetNativeVariantForObject(

            this.currentDropDownComboChoice, vOut);

    }



    else if (newChoice != null)

    {

        bool validInput = false;

        int indexInput = -1;

        for (indexInput = 0;

              indexInput < dropDownComboChoices.Length;

              indexInput++)

        {

            if (String.Compare(

               dropDownComboChoices[indexInput], newChoice,

               true) == 0)
{

            validInput = true;

            break;

        }

    }



    if (validInput)

    {

        this.currentDropDownComboChoice =

             dropDownComboChoices[indexInput];

        if (currentDropDownComboChoice ==

             Resources.Viva64)

            UseViva64Analysis(null, null);

        else if (currentDropDownComboChoice ==

                     Resources.GeneralAnalysis)

            UseGeneralAnalysis(null, null);

        else if (currentDropDownComboChoice ==

                     Resources.VivaMP)

            UseVivaMPAnalysis(null, null);

        else

        {

            throw (new ArgumentException());

        }

    }

    else

    {

        throw (new ArgumentException());

    }

}

else
{

            throw (new ArgumentException());

        }

    }

    else

    {

        throw (new ArgumentException());

    }

}

Причем здесь IntPtr.Zero и Marshal.GetNativeVariantForObject()? Ну так надо... Простой combobox
обрабатывается совсем не просто.

Причем этого кода не достаточно. Есть еще рядом функция OnMenuMyDropDownComboGetList()
примерно такого же размера.

Здесь C# оказался ничем не лучше любого другого языка. Нет, конечно же, круто, что он
инкапсулировал от меня OLE, маршалинг. На Си все было бы намного печальней. Но вот только
как-то все равно все не то, как преподносится в книгах и эвангелистами. Простота-то где? Я всего
лишь хотел с выпадающим списком поработать.


Навигация по коду в Visual Studio
Когда в Visual Studio вы щелкаете по сообщению об ошибке, срабатывает примерно такой код для
открытия файла и перехода к строке с ошибкой.

public void OpenDocumentAndNavigateTo(string path, int line,

    int column)

{

            IVsUIShellOpenDocument openDoc =

                    Package.GetGlobalService(

                    typeof(IVsUIShellOpenDocument))

                    as IVsUIShellOpenDocument;

        if (openDoc == null)

             return;

        IVsWindowFrame frame;

        Microsoft.VisualStudio.OLE.Interop.IServiceProvider sp;

        IVsUIHierarchy hier;
uint itemid;

  Guid logicalView = VSConstants.LOGVIEWID_Code;

  if (ErrorHandler.Failed(

      openDoc.OpenDocumentViaProject(path, ref logicalView,

        out sp, out hier, out itemid, out frame))

            || frame == null)

             return;

  object docData;

  frame.GetProperty((int)__VSFPROPID.VSFPROPID_DocData,

      out docData);



  VsTextBuffer buffer = docData as VsTextBuffer;

  if (buffer == null)

  {

        IVsTextBufferProvider bufferProvider =

             docData as IVsTextBufferProvider;

        if (bufferProvider != null)

        {

            IVsTextLines lines;

            ErrorHandler.ThrowOnFailure(

             bufferProvider.GetTextBuffer(out lines));

            buffer = lines as VsTextBuffer;

            if (buffer == null)

             return;

        }

  }

IVsTextManager mgr =

 Package.GetGlobalService(typeof(VsTextManagerClass))

 as IVsTextManager;

if (mgr == null)
return;

    mgr.NavigateToLineAndColumn(

      buffer, ref logicalView, line, column, line, column);

}

Ё-мое... Ужас. Набор магических заклинаний. Этот код, будучи написанным на C#, опять же ничем
не упростил жизнь своему разработчику. Кто скажет, что это будет лучше выглядеть на языке XYZ?
Язык здесь "перпендикулярен" к решаемой задаче и практически не оказывает влияния.


Работа с датой
Ну, уж работа с датами в C# должна быть точно на высоте! Ведь там столько разных удобных
форматов сделали. Думал я, до тех пор, пока из внешней программы не пришло время в формате
__time64_t, а в C# коде необходимо было использовать класс DateTime.

Конвертировать __time64_t в DataTime конечно не сложно, для этого всего лишь надо написать
функцию типа такой:

public static DateTime Time_T2DateTime(long time_t)

{

    //116444736000000000 - это 1600 год

    long win32FileTime = 10000000 * time_t + 116444736000000000;

    return DateTime.FromFileTime(win32FileTime);

}

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


Перебор всех проектов одного решения (solution)
Для некоторой задачи необходимо перебрать все проекты, которые есть в решении (Visual Studio
solution).

Вместо простого и элегантного foreach код выглядит так:

Solution2 solution = PVSStudio.DTE.Solution as Solution2;

SolutionBuild2 solutionBuild =

     (SolutionBuild2)solution.SolutionBuild;

SolutionContexts projectContexts =

     solutionBuild.ActiveConfiguration.SolutionContexts;
int prjCount = projectContexts.Count;

for (int i = 1; i <= prjCount; i++)

{

      SolutionContext projectContext = null;

      try

      {

            projectContext = projectContexts.Item(i);

      }

      catch (Exception)

      {

            // try/catch block is a workaround.

            // It's needed for correct working on solution

            // with unloaded projects.

            continue;

      }

...

Во-первых, оказывается, что foreach для этого класса недоступен. Но ладно, for-ом пользоваться
еще не разучились. Во-вторых, если обратиться к элементу, который в наборе есть, но у него "не
очень корректное" состояние – то летит исключение. В результате код заметно усложняется. А код
на C# опять ничем не отличается от кода на другом языке.


Выводы
Данным постом я хотел показать, что далеко не всегда код на C# (или другом языке) проще, чем
код на C/C++. И поэтому слепо верить в то, что "надо все переписать на C#" не нужно. Тем не
менее, я совершенно не считаю, что "C# - отстой", поскольку во многих местах он действительно
упрощает жизнь.

В чем причины того, что указанные в посте фрагменты кода выглядят также сложно, как и на C++?

    1. Взаимодействие с различными API. Например, как здесь было взаимодействие с Visual
       Studio API.
    2. Взаимодействие с программами на других языках. Например, тип __time64_t конечно же
       пришел от C++-приложения.
    3. Взаимодействие с операционной системой. Далеко не всегда удается состыковать
       красивый и правильный C#-код с реальностью в лице Windows.
    4. Несовершенство алгоритмов обработки данных. Если вы работаете со строками, то от "+1"
       в коде вы никуда не денетесь, на каком бы языке вы не писали.
Оправдания по использованному в примерах коду:

   1. Комментарии вырезаны, код сокращен до минимально необходимого в статье.
   2. Да, авторы кода не умеют писать на C#, но от этого C# не становится волшебнее.

Weitere ähnliche Inhalte

Was ist angesagt?

Статический и динамический полиморфизм в C++, Дмитрий Леванов
Статический и динамический полиморфизм в C++, Дмитрий ЛевановСтатический и динамический полиморфизм в C++, Дмитрий Леванов
Статический и динамический полиморфизм в C++, Дмитрий ЛевановYandex
 
C++ Core Guidelines
C++ Core Guidelines C++ Core Guidelines
C++ Core Guidelines Sergey Zubkov
 
Юрий Ефимочев, Компилируемые в реальном времени DSL для С++
Юрий Ефимочев, Компилируемые в реальном времени DSL для С++ Юрий Ефимочев, Компилируемые в реальном времени DSL для С++
Юрий Ефимочев, Компилируемые в реальном времени DSL для С++ Sergey Platonov
 
Сергей Шамбир, Адаптация Promise/A+ для взаимодействия между C++ и Javascript
Сергей Шамбир, Адаптация Promise/A+ для взаимодействия между C++ и JavascriptСергей Шамбир, Адаптация Promise/A+ для взаимодействия между C++ и Javascript
Сергей Шамбир, Адаптация Promise/A+ для взаимодействия между C++ и JavascriptSergey Platonov
 
Полухин Антон, Как делать не надо: C++ велосипедостроение для профессионалов
Полухин Антон, Как делать не надо: C++ велосипедостроение для профессионаловПолухин Антон, Как делать не надо: C++ велосипедостроение для профессионалов
Полухин Антон, Как делать не надо: C++ велосипедостроение для профессионаловSergey Platonov
 
Современный статический анализ кода: что умеет он, чего не умели линтеры
Современный статический анализ кода: что умеет он, чего не умели линтерыСовременный статический анализ кода: что умеет он, чего не умели линтеры
Современный статический анализ кода: что умеет он, чего не умели линтерыcorehard_by
 
Для чего мы делали свой акторный фреймворк и что из этого вышло?
Для чего мы делали свой акторный фреймворк и что из этого вышло?Для чего мы делали свой акторный фреймворк и что из этого вышло?
Для чего мы делали свой акторный фреймворк и что из этого вышло?Yauheni Akhotnikau
 
C# 5.0. Взгляд в будущее
C# 5.0. Взгляд в будущееC# 5.0. Взгляд в будущее
C# 5.0. Взгляд в будущееGetDev.NET
 
Дмитрий Кашицын, Вывод типов в динамических и не очень языках I
Дмитрий Кашицын, Вывод типов в динамических и не очень языках IДмитрий Кашицын, Вывод типов в динамических и не очень языках I
Дмитрий Кашицын, Вывод типов в динамических и не очень языках IPlatonov Sergey
 
Павел Довгалюк, Обратная отладка
Павел Довгалюк, Обратная отладкаПавел Довгалюк, Обратная отладка
Павел Довгалюк, Обратная отладкаSergey Platonov
 
Акторы на C++: стоило ли оно того?
Акторы на C++: стоило ли оно того?Акторы на C++: стоило ли оно того?
Акторы на C++: стоило ли оно того?Yauheni Akhotnikau
 
Александр Фокин, Рефлексия в C++
Александр Фокин, Рефлексия в C++Александр Фокин, Рефлексия в C++
Александр Фокин, Рефлексия в C++Sergey Platonov
 
Tdd webpack + testem + mocha + chai
Tdd webpack + testem + mocha + chaiTdd webpack + testem + mocha + chai
Tdd webpack + testem + mocha + chaiMichael Chernobrov
 
DI в C++ тонкости и нюансы
DI в C++ тонкости и нюансыDI в C++ тонкости и нюансы
DI в C++ тонкости и нюансыPlatonov Sergey
 
Никита Глушков, К вопросу о реализации кроссплатформенных фреймворков
Никита Глушков, К вопросу о реализации кроссплатформенных фреймворковНикита Глушков, К вопросу о реализации кроссплатформенных фреймворков
Никита Глушков, К вопросу о реализации кроссплатформенных фреймворковSergey Platonov
 
Программирование на языке C Sharp (СИ решетка) ПРАКТИКУМ
Программирование на языке C Sharp (СИ решетка) ПРАКТИКУМПрограммирование на языке C Sharp (СИ решетка) ПРАКТИКУМ
Программирование на языке C Sharp (СИ решетка) ПРАКТИКУМAlexandr Konfidentsialno
 
Антон Полухин, Немного о Boost
Антон Полухин, Немного о BoostАнтон Полухин, Немного о Boost
Антон Полухин, Немного о BoostSergey Platonov
 
Программирование на языке C Sharp (СИ решетка)
Программирование на языке C Sharp (СИ решетка)Программирование на языке C Sharp (СИ решетка)
Программирование на языке C Sharp (СИ решетка)Alexandr Konfidentsialno
 
Дмитрий Кашицын, Троллейбус из буханки: алиасинг и векторизация в LLVM
Дмитрий Кашицын, Троллейбус из буханки: алиасинг и векторизация в LLVMДмитрий Кашицын, Троллейбус из буханки: алиасинг и векторизация в LLVM
Дмитрий Кашицын, Троллейбус из буханки: алиасинг и векторизация в LLVMSergey Platonov
 
Объектно-Ориентированное Программирование на C++, Лекции 3 и 4
Объектно-Ориентированное Программирование на C++, Лекции  3 и 4 Объектно-Ориентированное Программирование на C++, Лекции  3 и 4
Объектно-Ориентированное Программирование на C++, Лекции 3 и 4 Dima Dzuba
 

Was ist angesagt? (20)

Статический и динамический полиморфизм в C++, Дмитрий Леванов
Статический и динамический полиморфизм в C++, Дмитрий ЛевановСтатический и динамический полиморфизм в C++, Дмитрий Леванов
Статический и динамический полиморфизм в C++, Дмитрий Леванов
 
C++ Core Guidelines
C++ Core Guidelines C++ Core Guidelines
C++ Core Guidelines
 
Юрий Ефимочев, Компилируемые в реальном времени DSL для С++
Юрий Ефимочев, Компилируемые в реальном времени DSL для С++ Юрий Ефимочев, Компилируемые в реальном времени DSL для С++
Юрий Ефимочев, Компилируемые в реальном времени DSL для С++
 
Сергей Шамбир, Адаптация Promise/A+ для взаимодействия между C++ и Javascript
Сергей Шамбир, Адаптация Promise/A+ для взаимодействия между C++ и JavascriptСергей Шамбир, Адаптация Promise/A+ для взаимодействия между C++ и Javascript
Сергей Шамбир, Адаптация Promise/A+ для взаимодействия между C++ и Javascript
 
Полухин Антон, Как делать не надо: C++ велосипедостроение для профессионалов
Полухин Антон, Как делать не надо: C++ велосипедостроение для профессионаловПолухин Антон, Как делать не надо: C++ велосипедостроение для профессионалов
Полухин Антон, Как делать не надо: C++ велосипедостроение для профессионалов
 
Современный статический анализ кода: что умеет он, чего не умели линтеры
Современный статический анализ кода: что умеет он, чего не умели линтерыСовременный статический анализ кода: что умеет он, чего не умели линтеры
Современный статический анализ кода: что умеет он, чего не умели линтеры
 
Для чего мы делали свой акторный фреймворк и что из этого вышло?
Для чего мы делали свой акторный фреймворк и что из этого вышло?Для чего мы делали свой акторный фреймворк и что из этого вышло?
Для чего мы делали свой акторный фреймворк и что из этого вышло?
 
C# 5.0. Взгляд в будущее
C# 5.0. Взгляд в будущееC# 5.0. Взгляд в будущее
C# 5.0. Взгляд в будущее
 
Дмитрий Кашицын, Вывод типов в динамических и не очень языках I
Дмитрий Кашицын, Вывод типов в динамических и не очень языках IДмитрий Кашицын, Вывод типов в динамических и не очень языках I
Дмитрий Кашицын, Вывод типов в динамических и не очень языках I
 
Павел Довгалюк, Обратная отладка
Павел Довгалюк, Обратная отладкаПавел Довгалюк, Обратная отладка
Павел Довгалюк, Обратная отладка
 
Акторы на C++: стоило ли оно того?
Акторы на C++: стоило ли оно того?Акторы на C++: стоило ли оно того?
Акторы на C++: стоило ли оно того?
 
Александр Фокин, Рефлексия в C++
Александр Фокин, Рефлексия в C++Александр Фокин, Рефлексия в C++
Александр Фокин, Рефлексия в C++
 
Tdd webpack + testem + mocha + chai
Tdd webpack + testem + mocha + chaiTdd webpack + testem + mocha + chai
Tdd webpack + testem + mocha + chai
 
DI в C++ тонкости и нюансы
DI в C++ тонкости и нюансыDI в C++ тонкости и нюансы
DI в C++ тонкости и нюансы
 
Никита Глушков, К вопросу о реализации кроссплатформенных фреймворков
Никита Глушков, К вопросу о реализации кроссплатформенных фреймворковНикита Глушков, К вопросу о реализации кроссплатформенных фреймворков
Никита Глушков, К вопросу о реализации кроссплатформенных фреймворков
 
Программирование на языке C Sharp (СИ решетка) ПРАКТИКУМ
Программирование на языке C Sharp (СИ решетка) ПРАКТИКУМПрограммирование на языке C Sharp (СИ решетка) ПРАКТИКУМ
Программирование на языке C Sharp (СИ решетка) ПРАКТИКУМ
 
Антон Полухин, Немного о Boost
Антон Полухин, Немного о BoostАнтон Полухин, Немного о Boost
Антон Полухин, Немного о Boost
 
Программирование на языке C Sharp (СИ решетка)
Программирование на языке C Sharp (СИ решетка)Программирование на языке C Sharp (СИ решетка)
Программирование на языке C Sharp (СИ решетка)
 
Дмитрий Кашицын, Троллейбус из буханки: алиасинг и векторизация в LLVM
Дмитрий Кашицын, Троллейбус из буханки: алиасинг и векторизация в LLVMДмитрий Кашицын, Троллейбус из буханки: алиасинг и векторизация в LLVM
Дмитрий Кашицын, Троллейбус из буханки: алиасинг и векторизация в LLVM
 
Объектно-Ориентированное Программирование на C++, Лекции 3 и 4
Объектно-Ориентированное Программирование на C++, Лекции  3 и 4 Объектно-Ориентированное Программирование на C++, Лекции  3 и 4
Объектно-Ориентированное Программирование на C++, Лекции 3 и 4
 

Andere mochten auch

Увлекательный мир программирования.
Увлекательный мир программирования.Увлекательный мир программирования.
Увлекательный мир программирования.Dmitri Soshnikov
 
принципы ооп и программирование классов в C#
принципы ооп и программирование классов в C#принципы ооп и программирование классов в C#
принципы ооп и программирование классов в C#bolevik
 
Языки программирования
Языки программированияЯзыки программирования
Языки программированияDmitri Soshnikov
 
Делегаты
ДелегатыДелегаты
ДелегатыREX-MDK
 
Chislovye tipy dannykh_i_ikh_ispolzovanie_v_vba
Chislovye tipy dannykh_i_ikh_ispolzovanie_v_vbaChislovye tipy dannykh_i_ikh_ispolzovanie_v_vba
Chislovye tipy dannykh_i_ikh_ispolzovanie_v_vbagreg1496
 
Интерфейсы
ИнтерфейсыИнтерфейсы
ИнтерфейсыREX-MDK
 
Безопасное программирование на C#
Безопасное программирование на C#Безопасное программирование на C#
Безопасное программирование на C#Darya Zubova
 
DevPro-2014: Кроссплатформенное приложение за 15 минут или Беды и победы моби...
DevPro-2014: Кроссплатформенное приложение за 15 минут или Беды и победы моби...DevPro-2014: Кроссплатформенное приложение за 15 минут или Беды и победы моби...
DevPro-2014: Кроссплатформенное приложение за 15 минут или Беды и победы моби...Artur Drobinskiy
 
язык программирования с#
язык программирования с#язык программирования с#
язык программирования с#Nitrosalat
 
Презентация курса "Основы программирования" на C#
Презентация курса "Основы программирования" на C#Презентация курса "Основы программирования" на C#
Презентация курса "Основы программирования" на C#Vadim Martynov
 

Andere mochten auch (20)

Интерфейсы
ИнтерфейсыИнтерфейсы
Интерфейсы
 
Особенности C#
Особенности C#Особенности C#
Особенности C#
 
2016 ВКР Черемискина Н.А.
2016 ВКР Черемискина Н.А.2016 ВКР Черемискина Н.А.
2016 ВКР Черемискина Н.А.
 
Web
WebWeb
Web
 
Увлекательный мир программирования.
Увлекательный мир программирования.Увлекательный мир программирования.
Увлекательный мир программирования.
 
ООП. Рекомендуемые информационные ресурсы
ООП. Рекомендуемые информационные ресурсыООП. Рекомендуемые информационные ресурсы
ООП. Рекомендуемые информационные ресурсы
 
принципы ооп и программирование классов в C#
принципы ооп и программирование классов в C#принципы ооп и программирование классов в C#
принципы ооп и программирование классов в C#
 
Составные части объектного подхода
Составные части объектного подходаСоставные части объектного подхода
Составные части объектного подхода
 
Языки программирования
Языки программированияЯзыки программирования
Языки программирования
 
Делегаты
ДелегатыДелегаты
Делегаты
 
Chislovye tipy dannykh_i_ikh_ispolzovanie_v_vba
Chislovye tipy dannykh_i_ikh_ispolzovanie_v_vbaChislovye tipy dannykh_i_ikh_ispolzovanie_v_vba
Chislovye tipy dannykh_i_ikh_ispolzovanie_v_vba
 
Async
AsyncAsync
Async
 
Интерфейсы
ИнтерфейсыИнтерфейсы
Интерфейсы
 
Безопасное программирование на C#
Безопасное программирование на C#Безопасное программирование на C#
Безопасное программирование на C#
 
Lec1
Lec1Lec1
Lec1
 
DevPro-2014: Кроссплатформенное приложение за 15 минут или Беды и победы моби...
DevPro-2014: Кроссплатформенное приложение за 15 минут или Беды и победы моби...DevPro-2014: Кроссплатформенное приложение за 15 минут или Беды и победы моби...
DevPro-2014: Кроссплатформенное приложение за 15 минут или Беды и победы моби...
 
язык программирования с#
язык программирования с#язык программирования с#
язык программирования с#
 
Luxoft async.net
Luxoft async.netLuxoft async.net
Luxoft async.net
 
Наследование и полиморфизм
Наследование и полиморфизмНаследование и полиморфизм
Наследование и полиморфизм
 
Презентация курса "Основы программирования" на C#
Презентация курса "Основы программирования" на C#Презентация курса "Основы программирования" на C#
Презентация курса "Основы программирования" на C#
 

Ähnlich wie О сложностях программирования, или C# нас не спасет?

PVS-Studio. Статический анализатор кода. Windows/Linux, C/C++/C#
PVS-Studio. Статический анализатор кода. Windows/Linux, C/C++/C#PVS-Studio. Статический анализатор кода. Windows/Linux, C/C++/C#
PVS-Studio. Статический анализатор кода. Windows/Linux, C/C++/C#Andrey Karpov
 
Intel IPP Samples for Windows - работа над ошибками
Intel IPP Samples for Windows - работа над ошибкамиIntel IPP Samples for Windows - работа над ошибками
Intel IPP Samples for Windows - работа над ошибкамиTatyanazaxarova
 
Deep c slides_oct2011_rus
Deep c slides_oct2011_rusDeep c slides_oct2011_rus
Deep c slides_oct2011_rusGarrikus
 
Статический анализ кода: Что? Как? Зачем?
Статический анализ кода: Что? Как? Зачем?Статический анализ кода: Что? Как? Зачем?
Статический анализ кода: Что? Как? Зачем?Andrey Karpov
 
Принципы работы статического анализатора кода PVS-Studio
Принципы работы статического анализатора кода PVS-StudioПринципы работы статического анализатора кода PVS-Studio
Принципы работы статического анализатора кода PVS-StudioAndrey Karpov
 
Статический анализ и регулярные выражения
Статический анализ и регулярные выраженияСтатический анализ и регулярные выражения
Статический анализ и регулярные выраженияTatyanazaxarova
 
статический анализ кода
статический анализ кодастатический анализ кода
статический анализ кодаAndrey Karpov
 
Статический анализ кода
Статический анализ кода Статический анализ кода
Статический анализ кода Pavel Tsukanov
 
Deep Dive C# by Sergey Teplyakov
Deep Dive  C# by Sergey TeplyakovDeep Dive  C# by Sergey Teplyakov
Deep Dive C# by Sergey TeplyakovAlex Tumanoff
 
Opensource на .NET
Opensource на .NETOpensource на .NET
Opensource на .NETlugnsk
 
Инструментируй это
Инструментируй этоИнструментируй это
Инструментируй этоRoman Dvornov
 
PVS-Studio, решение для разработки современных ресурсоемких приложений
PVS-Studio, решение для разработки современных ресурсоемких приложенийPVS-Studio, решение для разработки современных ресурсоемких приложений
PVS-Studio, решение для разработки современных ресурсоемких приложенийOOO "Program Verification Systems"
 
По колено в Си++ г... коде
По колено в Си++ г... кодеПо колено в Си++ г... коде
По колено в Си++ г... кодеTatyanazaxarova
 
Основы программирования на C++
Основы программирования на C++Основы программирования на C++
Основы программирования на C++Olga Maksimenkova
 
Что могут статические анализаторы, чего не могут программисты и тестировщики
Что могут статические анализаторы, чего не могут программисты и тестировщикиЧто могут статические анализаторы, чего не могут программисты и тестировщики
Что могут статические анализаторы, чего не могут программисты и тестировщикиAndrey Karpov
 
Коллекция примеров 64-битных ошибок в реальных программах
Коллекция примеров 64-битных ошибок в реальных программахКоллекция примеров 64-битных ошибок в реальных программах
Коллекция примеров 64-битных ошибок в реальных программахTatyanazaxarova
 
Объектно-Ориентированное Программирование на C++, Лекции 1 и 2
Объектно-Ориентированное Программирование на C++, Лекции 1 и 2Объектно-Ориентированное Программирование на C++, Лекции 1 и 2
Объектно-Ориентированное Программирование на C++, Лекции 1 и 2Dima Dzuba
 
Статический анализ кода: борьба с удорожанием ошибок
Статический анализ кода: борьба с удорожанием ошибокСтатический анализ кода: борьба с удорожанием ошибок
Статический анализ кода: борьба с удорожанием ошибокAndrey Karpov
 
Статический анализ Си++ кода и новый стандарт языка C++0x
Статический анализ Си++ кода и новый стандарт языка C++0xСтатический анализ Си++ кода и новый стандарт языка C++0x
Статический анализ Си++ кода и новый стандарт языка C++0xTatyanazaxarova
 

Ähnlich wie О сложностях программирования, или C# нас не спасет? (20)

PVS-Studio. Статический анализатор кода. Windows/Linux, C/C++/C#
PVS-Studio. Статический анализатор кода. Windows/Linux, C/C++/C#PVS-Studio. Статический анализатор кода. Windows/Linux, C/C++/C#
PVS-Studio. Статический анализатор кода. Windows/Linux, C/C++/C#
 
Intel IPP Samples for Windows - работа над ошибками
Intel IPP Samples for Windows - работа над ошибкамиIntel IPP Samples for Windows - работа над ошибками
Intel IPP Samples for Windows - работа над ошибками
 
Deep c slides_oct2011_rus
Deep c slides_oct2011_rusDeep c slides_oct2011_rus
Deep c slides_oct2011_rus
 
Статический анализ кода: Что? Как? Зачем?
Статический анализ кода: Что? Как? Зачем?Статический анализ кода: Что? Как? Зачем?
Статический анализ кода: Что? Как? Зачем?
 
Принципы работы статического анализатора кода PVS-Studio
Принципы работы статического анализатора кода PVS-StudioПринципы работы статического анализатора кода PVS-Studio
Принципы работы статического анализатора кода PVS-Studio
 
Статический анализ и регулярные выражения
Статический анализ и регулярные выраженияСтатический анализ и регулярные выражения
Статический анализ и регулярные выражения
 
статический анализ кода
статический анализ кодастатический анализ кода
статический анализ кода
 
Статический анализ кода
Статический анализ кода Статический анализ кода
Статический анализ кода
 
Deep Dive C# by Sergey Teplyakov
Deep Dive  C# by Sergey TeplyakovDeep Dive  C# by Sergey Teplyakov
Deep Dive C# by Sergey Teplyakov
 
Opensource на .NET
Opensource на .NETOpensource на .NET
Opensource на .NET
 
Инструментируй это
Инструментируй этоИнструментируй это
Инструментируй это
 
PVS-Studio, решение для разработки современных ресурсоемких приложений
PVS-Studio, решение для разработки современных ресурсоемких приложенийPVS-Studio, решение для разработки современных ресурсоемких приложений
PVS-Studio, решение для разработки современных ресурсоемких приложений
 
По колено в Си++ г... коде
По колено в Си++ г... кодеПо колено в Си++ г... коде
По колено в Си++ г... коде
 
Основы программирования на C++
Основы программирования на C++Основы программирования на C++
Основы программирования на C++
 
Что могут статические анализаторы, чего не могут программисты и тестировщики
Что могут статические анализаторы, чего не могут программисты и тестировщикиЧто могут статические анализаторы, чего не могут программисты и тестировщики
Что могут статические анализаторы, чего не могут программисты и тестировщики
 
Коллекция примеров 64-битных ошибок в реальных программах
Коллекция примеров 64-битных ошибок в реальных программахКоллекция примеров 64-битных ошибок в реальных программах
Коллекция примеров 64-битных ошибок в реальных программах
 
Объектно-Ориентированное Программирование на C++, Лекции 1 и 2
Объектно-Ориентированное Программирование на C++, Лекции 1 и 2Объектно-Ориентированное Программирование на C++, Лекции 1 и 2
Объектно-Ориентированное Программирование на C++, Лекции 1 и 2
 
Parallel STL
Parallel STLParallel STL
Parallel STL
 
Статический анализ кода: борьба с удорожанием ошибок
Статический анализ кода: борьба с удорожанием ошибокСтатический анализ кода: борьба с удорожанием ошибок
Статический анализ кода: борьба с удорожанием ошибок
 
Статический анализ Си++ кода и новый стандарт языка C++0x
Статический анализ Си++ кода и новый стандарт языка C++0xСтатический анализ Си++ кода и новый стандарт языка C++0x
Статический анализ Си++ кода и новый стандарт языка C++0x
 

Mehr von Tatyanazaxarova

Урок 27. Особенности создания инсталляторов для 64-битного окружения
Урок 27. Особенности создания инсталляторов для 64-битного окруженияУрок 27. Особенности создания инсталляторов для 64-битного окружения
Урок 27. Особенности создания инсталляторов для 64-битного окруженияTatyanazaxarova
 
Урок 26. Оптимизация 64-битных программ
Урок 26. Оптимизация 64-битных программУрок 26. Оптимизация 64-битных программ
Урок 26. Оптимизация 64-битных программTatyanazaxarova
 
Урок 25. Практическое знакомство с паттернами 64-битных ошибок
Урок 25. Практическое знакомство с паттернами 64-битных ошибокУрок 25. Практическое знакомство с паттернами 64-битных ошибок
Урок 25. Практическое знакомство с паттернами 64-битных ошибокTatyanazaxarova
 
Урок 24. Фантомные ошибки
Урок 24. Фантомные ошибкиУрок 24. Фантомные ошибки
Урок 24. Фантомные ошибкиTatyanazaxarova
 
Урок 23. Паттерн 15. Рост размеров структур
Урок 23. Паттерн 15. Рост размеров структурУрок 23. Паттерн 15. Рост размеров структур
Урок 23. Паттерн 15. Рост размеров структурTatyanazaxarova
 
Урок 21. Паттерн 13. Выравнивание данных
Урок 21. Паттерн 13. Выравнивание данныхУрок 21. Паттерн 13. Выравнивание данных
Урок 21. Паттерн 13. Выравнивание данныхTatyanazaxarova
 
Урок 20. Паттерн 12. Исключения
Урок 20. Паттерн 12. ИсключенияУрок 20. Паттерн 12. Исключения
Урок 20. Паттерн 12. ИсключенияTatyanazaxarova
 
Урок 19. Паттерн 11. Сериализация и обмен данными
Урок 19. Паттерн 11. Сериализация и обмен даннымиУрок 19. Паттерн 11. Сериализация и обмен данными
Урок 19. Паттерн 11. Сериализация и обмен даннымиTatyanazaxarova
 
Урок 17. Паттерн 9. Смешанная арифметика
Урок 17. Паттерн 9. Смешанная арифметикаУрок 17. Паттерн 9. Смешанная арифметика
Урок 17. Паттерн 9. Смешанная арифметикаTatyanazaxarova
 
Урок 16. Паттерн 8. Memsize-типы в объединениях
Урок 16. Паттерн 8. Memsize-типы в объединенияхУрок 16. Паттерн 8. Memsize-типы в объединениях
Урок 16. Паттерн 8. Memsize-типы в объединенияхTatyanazaxarova
 
Урок 15. Паттерн 7. Упаковка указателей
Урок 15. Паттерн 7. Упаковка указателейУрок 15. Паттерн 7. Упаковка указателей
Урок 15. Паттерн 7. Упаковка указателейTatyanazaxarova
 
Урок 13. Паттерн 5. Адресная арифметика
Урок 13. Паттерн 5. Адресная арифметикаУрок 13. Паттерн 5. Адресная арифметика
Урок 13. Паттерн 5. Адресная арифметикаTatyanazaxarova
 
Урок 11. Паттерн 3. Операции сдвига
Урок 11. Паттерн 3. Операции сдвигаУрок 11. Паттерн 3. Операции сдвига
Урок 11. Паттерн 3. Операции сдвигаTatyanazaxarova
 
Урок 10. Паттерн 2. Функции с переменным количеством аргументов
Урок 10. Паттерн 2. Функции с переменным количеством аргументовУрок 10. Паттерн 2. Функции с переменным количеством аргументов
Урок 10. Паттерн 2. Функции с переменным количеством аргументовTatyanazaxarova
 
Урок 9. Паттерн 1. Магические числа
Урок 9. Паттерн 1. Магические числаУрок 9. Паттерн 1. Магические числа
Урок 9. Паттерн 1. Магические числаTatyanazaxarova
 
Урок 8. Статический анализ для выявления 64-битных ошибок
Урок 8. Статический анализ для выявления 64-битных ошибокУрок 8. Статический анализ для выявления 64-битных ошибок
Урок 8. Статический анализ для выявления 64-битных ошибокTatyanazaxarova
 
Урок 7. Проблемы выявления 64-битных ошибок
Урок 7. Проблемы выявления 64-битных ошибокУрок 7. Проблемы выявления 64-битных ошибок
Урок 7. Проблемы выявления 64-битных ошибокTatyanazaxarova
 
Урок 6. Ошибки в 64-битном коде
Урок 6. Ошибки в 64-битном кодеУрок 6. Ошибки в 64-битном коде
Урок 6. Ошибки в 64-битном кодеTatyanazaxarova
 
Урок 5. Сборка 64-битного приложения
Урок 5. Сборка 64-битного приложенияУрок 5. Сборка 64-битного приложения
Урок 5. Сборка 64-битного приложенияTatyanazaxarova
 
Урок 4. Создание 64-битной конфигурации
Урок 4. Создание 64-битной конфигурацииУрок 4. Создание 64-битной конфигурации
Урок 4. Создание 64-битной конфигурацииTatyanazaxarova
 

Mehr von Tatyanazaxarova (20)

Урок 27. Особенности создания инсталляторов для 64-битного окружения
Урок 27. Особенности создания инсталляторов для 64-битного окруженияУрок 27. Особенности создания инсталляторов для 64-битного окружения
Урок 27. Особенности создания инсталляторов для 64-битного окружения
 
Урок 26. Оптимизация 64-битных программ
Урок 26. Оптимизация 64-битных программУрок 26. Оптимизация 64-битных программ
Урок 26. Оптимизация 64-битных программ
 
Урок 25. Практическое знакомство с паттернами 64-битных ошибок
Урок 25. Практическое знакомство с паттернами 64-битных ошибокУрок 25. Практическое знакомство с паттернами 64-битных ошибок
Урок 25. Практическое знакомство с паттернами 64-битных ошибок
 
Урок 24. Фантомные ошибки
Урок 24. Фантомные ошибкиУрок 24. Фантомные ошибки
Урок 24. Фантомные ошибки
 
Урок 23. Паттерн 15. Рост размеров структур
Урок 23. Паттерн 15. Рост размеров структурУрок 23. Паттерн 15. Рост размеров структур
Урок 23. Паттерн 15. Рост размеров структур
 
Урок 21. Паттерн 13. Выравнивание данных
Урок 21. Паттерн 13. Выравнивание данныхУрок 21. Паттерн 13. Выравнивание данных
Урок 21. Паттерн 13. Выравнивание данных
 
Урок 20. Паттерн 12. Исключения
Урок 20. Паттерн 12. ИсключенияУрок 20. Паттерн 12. Исключения
Урок 20. Паттерн 12. Исключения
 
Урок 19. Паттерн 11. Сериализация и обмен данными
Урок 19. Паттерн 11. Сериализация и обмен даннымиУрок 19. Паттерн 11. Сериализация и обмен данными
Урок 19. Паттерн 11. Сериализация и обмен данными
 
Урок 17. Паттерн 9. Смешанная арифметика
Урок 17. Паттерн 9. Смешанная арифметикаУрок 17. Паттерн 9. Смешанная арифметика
Урок 17. Паттерн 9. Смешанная арифметика
 
Урок 16. Паттерн 8. Memsize-типы в объединениях
Урок 16. Паттерн 8. Memsize-типы в объединенияхУрок 16. Паттерн 8. Memsize-типы в объединениях
Урок 16. Паттерн 8. Memsize-типы в объединениях
 
Урок 15. Паттерн 7. Упаковка указателей
Урок 15. Паттерн 7. Упаковка указателейУрок 15. Паттерн 7. Упаковка указателей
Урок 15. Паттерн 7. Упаковка указателей
 
Урок 13. Паттерн 5. Адресная арифметика
Урок 13. Паттерн 5. Адресная арифметикаУрок 13. Паттерн 5. Адресная арифметика
Урок 13. Паттерн 5. Адресная арифметика
 
Урок 11. Паттерн 3. Операции сдвига
Урок 11. Паттерн 3. Операции сдвигаУрок 11. Паттерн 3. Операции сдвига
Урок 11. Паттерн 3. Операции сдвига
 
Урок 10. Паттерн 2. Функции с переменным количеством аргументов
Урок 10. Паттерн 2. Функции с переменным количеством аргументовУрок 10. Паттерн 2. Функции с переменным количеством аргументов
Урок 10. Паттерн 2. Функции с переменным количеством аргументов
 
Урок 9. Паттерн 1. Магические числа
Урок 9. Паттерн 1. Магические числаУрок 9. Паттерн 1. Магические числа
Урок 9. Паттерн 1. Магические числа
 
Урок 8. Статический анализ для выявления 64-битных ошибок
Урок 8. Статический анализ для выявления 64-битных ошибокУрок 8. Статический анализ для выявления 64-битных ошибок
Урок 8. Статический анализ для выявления 64-битных ошибок
 
Урок 7. Проблемы выявления 64-битных ошибок
Урок 7. Проблемы выявления 64-битных ошибокУрок 7. Проблемы выявления 64-битных ошибок
Урок 7. Проблемы выявления 64-битных ошибок
 
Урок 6. Ошибки в 64-битном коде
Урок 6. Ошибки в 64-битном кодеУрок 6. Ошибки в 64-битном коде
Урок 6. Ошибки в 64-битном коде
 
Урок 5. Сборка 64-битного приложения
Урок 5. Сборка 64-битного приложенияУрок 5. Сборка 64-битного приложения
Урок 5. Сборка 64-битного приложения
 
Урок 4. Создание 64-битной конфигурации
Урок 4. Создание 64-битной конфигурацииУрок 4. Создание 64-битной конфигурации
Урок 4. Создание 64-битной конфигурации
 

Kürzlich hochgeladen (9)

Cyber Defense Doctrine Managing the Risk Full Applied Guide to Organizational...
Cyber Defense Doctrine Managing the Risk Full Applied Guide to Organizational...Cyber Defense Doctrine Managing the Risk Full Applied Guide to Organizational...
Cyber Defense Doctrine Managing the Risk Full Applied Guide to Organizational...
 
ИСТОЧНИКИ ИННОВАЦИОННОСТИ КИТАЯ (ПО ВЕРСИИ DGAP) | The Sources of China’s Inn...
ИСТОЧНИКИ ИННОВАЦИОННОСТИ КИТАЯ (ПО ВЕРСИИ DGAP) | The Sources of China’s Inn...ИСТОЧНИКИ ИННОВАЦИОННОСТИ КИТАЯ (ПО ВЕРСИИ DGAP) | The Sources of China’s Inn...
ИСТОЧНИКИ ИННОВАЦИОННОСТИ КИТАЯ (ПО ВЕРСИИ DGAP) | The Sources of China’s Inn...
 
Malware. DCRAT (DARK CRYSTAL RAT) [RU].pdf
Malware. DCRAT (DARK CRYSTAL RAT) [RU].pdfMalware. DCRAT (DARK CRYSTAL RAT) [RU].pdf
Malware. DCRAT (DARK CRYSTAL RAT) [RU].pdf
 
Ransomware_Q3 2023. The report [RU].pdf
Ransomware_Q3 2023.  The report [RU].pdfRansomware_Q3 2023.  The report [RU].pdf
Ransomware_Q3 2023. The report [RU].pdf
 
СИСТЕМА ОЦЕНКИ УЯЗВИМОСТЕЙ CVSS 4.0 / CVSS v4.0 [RU].pdf
СИСТЕМА ОЦЕНКИ УЯЗВИМОСТЕЙ CVSS 4.0 / CVSS v4.0 [RU].pdfСИСТЕМА ОЦЕНКИ УЯЗВИМОСТЕЙ CVSS 4.0 / CVSS v4.0 [RU].pdf
СИСТЕМА ОЦЕНКИ УЯЗВИМОСТЕЙ CVSS 4.0 / CVSS v4.0 [RU].pdf
 
MS Navigating Incident Response [RU].pdf
MS Navigating Incident Response [RU].pdfMS Navigating Incident Response [RU].pdf
MS Navigating Incident Response [RU].pdf
 
Cyberprint. Dark Pink Apt Group [RU].pdf
Cyberprint. Dark Pink Apt Group [RU].pdfCyberprint. Dark Pink Apt Group [RU].pdf
Cyberprint. Dark Pink Apt Group [RU].pdf
 
2023 Q4. The Ransomware report. [RU].pdf
2023 Q4. The Ransomware report. [RU].pdf2023 Q4. The Ransomware report. [RU].pdf
2023 Q4. The Ransomware report. [RU].pdf
 
CVE. The Fortra's GoAnywhere MFT [RU].pdf
CVE. The Fortra's GoAnywhere MFT [RU].pdfCVE. The Fortra's GoAnywhere MFT [RU].pdf
CVE. The Fortra's GoAnywhere MFT [RU].pdf
 

О сложностях программирования, или C# нас не спасет?

  • 1. О сложностях программирования, или C# нас не спасет? Автор: Евгений Рыжков Дата: 26.10.2010 Программирование это сложно. С этим никто, надеюсь, не спорит. Но вот тема новых языков программирования, а точнее поиск "серебряной пули" всегда находит бурных отклик в умах разработчиков программного обеспечения. Особенно "модной" является тема превосходства одного языка программирования над другим. Ну, к примеру, что C# "круче", чем C++. И хотя holy wars – это не та причина, по которой я пишу этот пост, тем не менее, что называется "наболело". Ну не поможет C#/lisp/F#/Haskell/... написать изящное приложение, взаимодействующее с внешним миром, и все тут. Вся изящность теряется, стоит захотеть написать что-то реальное, а не пример "сам в себе". В тексте несколько фрагментов на C#, взятые из модуля интеграции статического анализатора кода PVS-Studio в популярную среду Microsoft Visual Studio. Этими фрагментами я хочу показать, что писать, к примеру, на C# совсем не проще, чем на, C++. Простой combobox Этак, первый фрагмент кода – обработка выбора одной из трех строк в ОБЫЧНОМ combobox на панели инструментов с картинки. Рисунок 1 – Простой combobox на три строчки И вот для обработки такой вот фитюльки требуется следующий код. К сожалению, пришлось изменить форматирование и убрать комментарии. Так что прошу прощения за ужас. private void OnMenuMyDropDownCombo(object sender, EventArgs e) { if (e == EventArgs.Empty) { throw (new ArgumentException());
  • 2. } OleMenuCmdEventArgs eventArgs = e as OleMenuCmdEventArgs; if (eventArgs != null) { string newChoice = eventArgs.InValue as string; IntPtr vOut = eventArgs.OutValue; if (vOut != IntPtr.Zero && newChoice != null) { throw (new ArgumentException()); } else if (vOut != IntPtr.Zero) { Marshal.GetNativeVariantForObject( this.currentDropDownComboChoice, vOut); } else if (newChoice != null) { bool validInput = false; int indexInput = -1; for (indexInput = 0; indexInput < dropDownComboChoices.Length; indexInput++) { if (String.Compare( dropDownComboChoices[indexInput], newChoice, true) == 0)
  • 3. { validInput = true; break; } } if (validInput) { this.currentDropDownComboChoice = dropDownComboChoices[indexInput]; if (currentDropDownComboChoice == Resources.Viva64) UseViva64Analysis(null, null); else if (currentDropDownComboChoice == Resources.GeneralAnalysis) UseGeneralAnalysis(null, null); else if (currentDropDownComboChoice == Resources.VivaMP) UseVivaMPAnalysis(null, null); else { throw (new ArgumentException()); } } else { throw (new ArgumentException()); } } else
  • 4. { throw (new ArgumentException()); } } else { throw (new ArgumentException()); } } Причем здесь IntPtr.Zero и Marshal.GetNativeVariantForObject()? Ну так надо... Простой combobox обрабатывается совсем не просто. Причем этого кода не достаточно. Есть еще рядом функция OnMenuMyDropDownComboGetList() примерно такого же размера. Здесь C# оказался ничем не лучше любого другого языка. Нет, конечно же, круто, что он инкапсулировал от меня OLE, маршалинг. На Си все было бы намного печальней. Но вот только как-то все равно все не то, как преподносится в книгах и эвангелистами. Простота-то где? Я всего лишь хотел с выпадающим списком поработать. Навигация по коду в Visual Studio Когда в Visual Studio вы щелкаете по сообщению об ошибке, срабатывает примерно такой код для открытия файла и перехода к строке с ошибкой. public void OpenDocumentAndNavigateTo(string path, int line, int column) { IVsUIShellOpenDocument openDoc = Package.GetGlobalService( typeof(IVsUIShellOpenDocument)) as IVsUIShellOpenDocument; if (openDoc == null) return; IVsWindowFrame frame; Microsoft.VisualStudio.OLE.Interop.IServiceProvider sp; IVsUIHierarchy hier;
  • 5. uint itemid; Guid logicalView = VSConstants.LOGVIEWID_Code; if (ErrorHandler.Failed( openDoc.OpenDocumentViaProject(path, ref logicalView, out sp, out hier, out itemid, out frame)) || frame == null) return; object docData; frame.GetProperty((int)__VSFPROPID.VSFPROPID_DocData, out docData); VsTextBuffer buffer = docData as VsTextBuffer; if (buffer == null) { IVsTextBufferProvider bufferProvider = docData as IVsTextBufferProvider; if (bufferProvider != null) { IVsTextLines lines; ErrorHandler.ThrowOnFailure( bufferProvider.GetTextBuffer(out lines)); buffer = lines as VsTextBuffer; if (buffer == null) return; } } IVsTextManager mgr = Package.GetGlobalService(typeof(VsTextManagerClass)) as IVsTextManager; if (mgr == null)
  • 6. return; mgr.NavigateToLineAndColumn( buffer, ref logicalView, line, column, line, column); } Ё-мое... Ужас. Набор магических заклинаний. Этот код, будучи написанным на C#, опять же ничем не упростил жизнь своему разработчику. Кто скажет, что это будет лучше выглядеть на языке XYZ? Язык здесь "перпендикулярен" к решаемой задаче и практически не оказывает влияния. Работа с датой Ну, уж работа с датами в C# должна быть точно на высоте! Ведь там столько разных удобных форматов сделали. Думал я, до тех пор, пока из внешней программы не пришло время в формате __time64_t, а в C# коде необходимо было использовать класс DateTime. Конвертировать __time64_t в DataTime конечно не сложно, для этого всего лишь надо написать функцию типа такой: public static DateTime Time_T2DateTime(long time_t) { //116444736000000000 - это 1600 год long win32FileTime = 10000000 * time_t + 116444736000000000; return DateTime.FromFileTime(win32FileTime); } И здесь C# оказался ничем не лучше... Возможно конечно я не нашел функцию конвертации. Ну, неужели нельзя было у DateTime нужный конструктор сделать? Ну почему, как взаимодействие с окружающей средой, так опять все по старинке "ручками" делать приходится? Перебор всех проектов одного решения (solution) Для некоторой задачи необходимо перебрать все проекты, которые есть в решении (Visual Studio solution). Вместо простого и элегантного foreach код выглядит так: Solution2 solution = PVSStudio.DTE.Solution as Solution2; SolutionBuild2 solutionBuild = (SolutionBuild2)solution.SolutionBuild; SolutionContexts projectContexts = solutionBuild.ActiveConfiguration.SolutionContexts;
  • 7. int prjCount = projectContexts.Count; for (int i = 1; i <= prjCount; i++) { SolutionContext projectContext = null; try { projectContext = projectContexts.Item(i); } catch (Exception) { // try/catch block is a workaround. // It's needed for correct working on solution // with unloaded projects. continue; } ... Во-первых, оказывается, что foreach для этого класса недоступен. Но ладно, for-ом пользоваться еще не разучились. Во-вторых, если обратиться к элементу, который в наборе есть, но у него "не очень корректное" состояние – то летит исключение. В результате код заметно усложняется. А код на C# опять ничем не отличается от кода на другом языке. Выводы Данным постом я хотел показать, что далеко не всегда код на C# (или другом языке) проще, чем код на C/C++. И поэтому слепо верить в то, что "надо все переписать на C#" не нужно. Тем не менее, я совершенно не считаю, что "C# - отстой", поскольку во многих местах он действительно упрощает жизнь. В чем причины того, что указанные в посте фрагменты кода выглядят также сложно, как и на C++? 1. Взаимодействие с различными API. Например, как здесь было взаимодействие с Visual Studio API. 2. Взаимодействие с программами на других языках. Например, тип __time64_t конечно же пришел от C++-приложения. 3. Взаимодействие с операционной системой. Далеко не всегда удается состыковать красивый и правильный C#-код с реальностью в лице Windows. 4. Несовершенство алгоритмов обработки данных. Если вы работаете со строками, то от "+1" в коде вы никуда не денетесь, на каком бы языке вы не писали.
  • 8. Оправдания по использованному в примерах коду: 1. Комментарии вырезаны, код сокращен до минимально необходимого в статье. 2. Да, авторы кода не умеют писать на C#, но от этого C# не становится волшебнее.