Регистрация    Вход    Форум    Поиск    FAQ

  •  Новости
  • Beeline + Twitter = чирикай через SMS!

    Beeline + Twitter = чирикай через SMS! На первой картинке обозначены команды, при помощи которых через SMS Вы сможете кого-либо зафолловить или же отписаться, ретвитнуть чей-либо пост или же написать личное сообщение.

    Open Graph Protocol. От создателей Facebook

    Open Graph Protocol. От создателей Facebook Разбираясь с Facebook API, случайно наткнулся на другую интересную разработку от этих людей.

    Глобальное ускорение Wordpress

    Глобальное ускорение Wordpress Не считая очевидных решений типа отключения некоторых плагинов и перехода на тему попроще, я вижу 2 пути для оптимизации: кэширование и сжатие траффика.




  •  Часы


  •  Поиск

Optimaze » Программирование » C# pointer hell или как не попасть впросак




C# pointer hell или как не попасть впросак



    Если нам надо в структуре использовать массив заданной величины (как вы знаете проинициализировать свойства структуры до ее создания мы не можем), поэтому решение опять же в использование fixed.

    А руки иногда почесываются поставить? Нет, значит вы на правильном пути, нечего шаловливым ручонкам к памяти давать доступ. Вот и я думал, что не придется, а все же…

    Бывают ситуации, хотя и очень редко, когда надо использовать библиотеку (*. dll) написанную скажем на Delphi. И если для использования этой библиотеки нету промежуточного COM объекта или иных достижений цивилизации, да если еще «коллеги» написали в качестве параметров указатели (передаю им привет Wink), то тогда эта заметка будет вам в помощь. Конечно, надеюсь, что вы с таким не столкнетесь, но всякое бывает.

     

    Итак, как использовать экспортируемые библиотеки из *. dll я сильно расписывать не буду, скажу, что в моем случае я использовал DllImport, вот пример:

    • using System. Runtime. InteropServices;
    •  
    • namespace DllHell
    • {
    •        public static class Test{
    •               [DllImport("MyLib. dll" )]
    •               private static extern int SomeFunction();

           }

    }

     

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

     

    Все хорошо, но если мы имеет что-то вроде этого:

    • [DllImport("MyLib. dll";)]
    • private extern int SomeFunction(byte* pData, char* oid, int size);

     

    Паниковать не надо, все решаемо. Для начала стоит разрешить в проекту использование unsafe («небезопасного», вот какого мнения об указателях Microsoft =|) кода.

    Данная опция позволяет использовать в проектк директиву unsafe, без нее компилятор будет очень громко ругатся на какие том там непонятные звездочки и амперсанты. Если следующие варианты использования:

    Объявить класс как unsafe:

     

    •          unsafe public class Test
    •          {
    •          }

     Только метод:

     

    •           unsafe public void SomeMethod()
    •           {
    •           }

     

    Или же участок кода:

     

    •         unsafe
    •         {
    •                 //Some cod here
    •         }

     

    Опять же не все так просто, как казалось. Мы можем в таком участке кода объявлять указатели и брать адресса через оператор «&». Но если нам надо использовать указатель на byte[] или же char[]. На конструкцию следующего типа:

    • unsafe
    • {
    •         char[] buf = new char[10];
    •         char* pBuf = h;
    • }

    компилятор вам деликатно скажет, что он не может взять адреса, использовать sizeof(), и объявлять укаазтели на managed types, к коим относится, в частности, char[].

    Решение этой проблемы в использовании директивы fixed. Проще говоря, данная директива исключает то, что ваша переменная будет выброшена в мусор GC (garbage collector). Пример использования:

     

    • unsafe
    • {
    •         byte[] buf = new byte[10] { 1,2,3,4,5,6,7,8,9,10};
    •         fixed (byte* pBuf = buf)
    •         {  
    •                 pBuf[2] = 0; // в buf элемент с индексом 2 будет равен 0
    •         }
    • }

     

    Также директива fixed в C# 2. 0 и выше может использоваться еще в одном контексте. Например если нам надо в структуре использовать массив заданной величины (как вы знаете проинициализировать свойства структуры до ее создания мы не можем), поэтому решение опять же в использование fixed:

    • unsafe public struct SomeStruct
    • {
    •           public fixed char arr[200];
    • }

     

    Вот и все, чем я хотел с вами поделится. Данная заметка не предентует на оригинальность, но надеюсь кому-то будет полезно.



    Рейтинг: 4.8/5, основан на 25 голосах.


    Нравится



    Вернутся назад


       

    Вам будет интересно:

    Доступ к статическим полям в Spring.NET

    Часто при конфигурации приложения через Spring. NET xml-файл требуется присвоить какому-то свойству значение статического поля определенного класса.

    HTML 5 – Часть 1. Анимированный холст

    Думаю, каждый из вас уже играл или хотя-бы видел интерактивного “пакмана” на главной странице Google.

    JSR 292 Review Ballot

    Данная спецификация призвана решить проблему языков с динамической типизацией, таких как PHP, Perl, Python при реализации их на Java платформе (имеется ввиду JVM).

    Простой пример WCF хостинга в консольном приложении (console application)

    WCF - последнее решение от Microsoft для организации взаимодействия разрозненных элементов систем на платформе .NET.



    •  Публикации


    8 методов раскрутки своего форума с нуля

    8 методов раскрутки своего форума с нуля Итак, у вас имеется свой собственный форум, но его никто не посещает? Мы готовы помочь вам справиться с этой нелегкой проблемой.

    Как привлекать посетителей на проект

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

    Про MySQL, серверы и PayPal

    Про MySQL, серверы и PayPal Проклял все настройки кодировок, проклял DirectAdmin и еле-еле нашел то место где располагается и задается общий пароль для ...

    Реклама в Твиттере. Как подать свой продукт

    Реклама в Твиттере. Как подать свой продукт Твиттер уже давно стал из нового web 2. 0 сервиса рекламной площадкой с огромным количеством потенциальных пользователей ...

    Пока блог на локалхосте

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

    Авторитет блоггера притягивает

    Авторитет блоггера притягивает Долго не знал с чего начать данную статью. Статья что-то типа мыслей вслух и философии.