Делаем code-background-color persistance в Visual Studio 2010

Сегодня утром пришло письмо с connect.microsoft.com, куда я запостил баг о том, что VS2010 не умеет сохранять настройку цвета фона. И вот что, данный баг пофиксен:

image

Цитирую:

“For now, there is an extension written by a member of the VS Editor team as a patch that will allow custom background colors to persist. You can find it in VS by going to Tools->Extension Manager and searching for the "BackgroundPatchExtension," or download it from a web browser at this link: http://visualstudiogallery.msdn.microsoft.com/en-us/d53e0db3-6c41-4cf5-8ca1-339aeef1ac30. Once you install it, just make sure it is enabled in the Extension Manager, and your background color should be applied correctly.”

Надеюсь для кого-нибудь это будет полезным.


На моём HP Mini запустилась Visual Studio 2010

Перед моей поездкой в Индию я купил нетбук HP Mini 2140. Это прекрасная вещь. Он весит всего 1,8 кг. Поддерживает максимальное разрешение 1024 x 576 (нормальный по ширине но укороченный по высоте). Он обладает клавиатурой почти нормального размера. Моей любимой особенностью является то, что он может работать порядка 8 часов – что довольно таки долго.

Он поставляется с предустановленной Windows XP. Но я скачал и установил на него Windows 7RC. В мини нет DVD или компакт-дисков. Я скопировал образ Windows 7 на USB-флешку с помощью Daemon Tools. И установил Windows 7 с USB-флешки.

Далее я установил Windows Live Sync (так же известный как foldershare). Windows Live Sync синхронизирует файлы из папки My Documents\Everywhere между моим лаптопом, десктопом и нетбуком. Я могу изменять документы на моём нетбуке в автобусе Microsoft двигаясь на работу, позже они автоматически синхронизируются с компьютером на моём рабочем месте.

И наконец, я поставил на свой нетбук Visual Studio 2010. Я взял послений билд. Скорее всего мой нетбук не подходит даже под минимальную требуемую конфигурацию, однако Visual Studio 2010 работает прекрасно.

Я не уверен, что при работе Visual Studio на нетбуке процессор Atom моего HP Mini, выжимает из нетбука всё. И, определенно, не стоит запускать несколько приложений при работе Visual Studio. Однако данный пример показывает, что можно довольно-таки продуктивно потратить время, проведенное в самолёте или автобусе, за разработкой.

Во время установки VS2010 был даже такой момент, когда мне показалось, что она закончится неудачей, т.к. инсталлятор сообщил о том, что мой нетбук не подходит под минимальные требования разрешений (высота оказалась на 3 пикселя меньше требуемой), однако, я проигнорировал предупреждение, и установка успешно продолжилась.

image

От меня

Ну что же, радует тот факт, что Visual Studio 2010 запустилась на нетбуке, с нетерпением жду Пн, 18 мая, чтобы слить beta 1.

Данная статья является переводом:

http://stephenwalther.com/blog/archive/2009/05/14/my-hp-mini-runs-visual-studio-2010.aspx


Рассуждения о производительности объектной модели SharePoint

Введение

img13[1] Основными сущностями, с которыми приходится работать в рамках объектной модели SharePoint являются списки (SPList). Поэтому, считаю, что необходимо, в очередной раз, сделать акцент на способах работы с ними. Поэтому, если вас беспокоят такие вопросы, как:

  • Получение количества строк в списке
  • Получение значений записей в списках
  • Использование запросов (SPQuery) и представлений (SPView)
  • Пейджинг (постраничное разбиение) (довольно-таки не тривиальная реализация, поверьте)
  • Обновление большого числа записей
  • Обнаружение “медленных” списков

прошу прочесть, внимательно, данный текст:

http://www.infoq.com/articles/SharePoint-Andreas-Grabner

img5[1]


SPVisualDev – инструмент Sharepoint разработчика

Введение

Я, как разработчик под платформу Sharepoint, постоянно сталкиваюсь с такими задачами, как создание большого количества однообразного XML-кода (к примеру для описания Feature, WePart, Content Type, List Template и т.д.) что не совсем удобно. Для облегчения выполнения этих задач есть несколько инструментов:

  • один из них это Visual Studio Extensions for SharePoint (VSeWSS), я так и не смог привыкнуть к работе сним, в связи с непрозрачностью генерируемых на выходе решений, что значительно уменьшало гибкость разрабатываемых решений
  • следующий инструмент STSDev – фактически это набор шаблонов для проектов в Visual Studio, является внешней утилитой, удобен в использовании, но полезен лишь на начальной стадии знакомства с платформой
  • ну и последний, на котором хотелось бы заострить внимание, это SPVisualDev

Подробнее

 

Данный продукт представляет собой расширения для Visual Studio, из чего следует тип проектов и прочие удобства, о которых подробнее:

  • Синхронизация в режиме реального времени локальной копии и папки 12
  • Простой способ добавления новых фич в проект, а так же редактирование их свойств и элементов в графических формах (а не XML-файлах)
  • Легкость в активации/деактивации фич из контекстного меню в проекте VS
  • Автоматическая генерация и синхронизация обработчиков фич
  • Набор стандартных проектов и элементов, включая веб-части, обработчики событий, шаблонные страницы и т.д.
  • Отладка фич для страниц приложения с возможностью присоединения дебагера VS к просмотриваемой странице
  • Интеграция с отличных инструментом для создания WSP-пакетов WSPBuilder

FileDownload[1]Так же приложение имеет исчерпывающее количество сопроводительной документации и даже Visual How-to.

Настоятельно рекомендую поставить и попробовать в деле и почувствовать насколько приятно работать с этим инструментом.

Однако это не панацея, а следовательно всё, что не предусмотрено инструментом, придется делать самостоятельно.


Головоломки на C# (Ответы)

Введение

Итак, в предыдущем посте мною были приведены 6 вариантов необычного поведения языковых конструкций на C#. В этом посте я постараюсь дать более-менее внятное объяснение данных особенностей происходящего.

Ответы

Далее я продублирую приведенные фрагменты кода, а так же дополню их описанием нюансов

  1. Перегрузка

    Как вы думаете что выведет данный код и почему?

    using System;
    
    class Base
    {
        public virtual void Foo(int x)
        {
            Console.WriteLine ("Base.Foo(int)");
        }
    }
    
    class Derived : Base
    {
        public override void Foo(int x)
        {
            Console.WriteLine ("Derived.Foo(int)");
        }
        
        public void Foo(object o)
        {
            Console.WriteLine ("Derived.Foo(object)");
        }
    }
    
    class Test
    {
        static void Main()
        {
            Derived d = new Derived();
            int i = 10;
            d.Foo(i);
        }
    }

    Результат: Derived.Foo(object).Мы получили его таким, т.к. при выборе подходящего перегруженного метода в наследуемом типе компилятор игнорирует определенный в базовом типе метод, даже если он был переопределен в наследуемом!

  2. Порядок! Порядок!

    В каком порядке напечатаются строки на экране?

    using System;
    
    class Foo
    {
        static Foo()
        {
            Console.WriteLine ("Foo");
        }
    }
    
    class Bar
    {
        static int i = Init();
        
        static int Init()
        {
            Console.WriteLine("Bar");
            return 0;
        }
    }
    
    class Test
    {
        static void Main()
        {
            Foo f = new Foo();
            Bar b = new Bar();
        }
    } 

    Результат: В варианте Джона он получает следующую последовательность: “Bar, Foo”, однако при воспроизведении на своей машине у меня получилось: “Foo, Bar”. Я думаю, что причина различий лежит в разнице версий исполняющей среды (CLR, я исполнял код на версии 2.0.50727.3053). Он объясняет свои результаты тем, что у Foo конструктор статический, следовательно он не будет выполнен до точки первой инициализации этого класса. У Bar же нет статического конструктора, что позволяет CLR инициализировать его раньше. Однако, нет гарантии, что Bar будет напечатан вовсе, так как в нашем примере у CLR в принципе нет надобности инициализировать это статическое поле. Более подробно все эти нюансы описаны здесь!

  3. “Глупая” арифметика

    Компьютеры призваны помочь нам с арифметическими вычислениями, но почему тогда это выражение выводит false?

    double d1 = 1.000001;
    double d2 = 0.000001;
    Console.WriteLine((d1-d2)==1.0); 

    А такой вариант?

    double sum = 0;
    for (int i =0;i<10 ;i++ )
    {
      sum+=0.1;    
    }
    Console.WriteLine(sum==1.0); 

    Результат: Все значения в данных примерах хранятся в двоичном виде, хотя 1.0 может хранится как точное значение, 1.000001 будет храниться примерно как 1.0000009999999999177333620536956004798412322998046875, и 0.000001 так же будет сохранено в виде 0.000000999999999999999954748111825886258685613938723690807819366455078125. В связи с этим нельзя утверждать о равенстве в предыдущих примерах. Почитать подробнее о числах с плавающей точкой.

    На заметку: В связи с указанными выше особенностями работы с типами с плавающей точкой, однозначно рекомендуют не использовать их при работе с денежными единицами, в данном случае рекомендуют определять собственные денежные типы (так называемые типы объект-значение [Object-Value]) с собственной логикой округления и прочих арифметических операций, а так же межвалютных операций.

  4. Печать, печать, печать

    Ниже приведен код, использующий анонимные методы, каков будет результат его исполнения?

    using System;
    using System.Collections.Generic;
    
    class Test
    {
        delegate void Printer();
        
        static void Main()
        {
            List<Printer> printers = new List<Printer>();
            for (int i=0; i < 10; i++)
            {
                printers.Add(delegate { Console.WriteLine(i); });
            }
            
            foreach (Printer printer in printers)
            {
                printer();
            }
        }
    } 

    Результат: О эта радость от фиксированных переменных. В данном примере всего одна переменная и её значение изменяется при каждой итерации в цикле. Анонимные методы фиксируют переменную, а не её значение, следовательно в результате мы получим десть раз число 10 на выводе!

  5. Ничего странного с компилятором тут не случилось

    Этот код скомпилится? Как это? Что бы это значило?

    using System;
    
    class Test
    {
        enum Foo { Bar, Baz };
        
        static void Main()
        {
            Foo f = 0.0;
            Console.WriteLine(f);
        }
    }

    Результат: Это не должно компилироваться, однако это происходит. Это не должно копилироваться, в связи с тем, что только значение 0 может быть конвертированно в значение по умолчанию для enum. В примере же значение 0.0 имеет место быть корректным в связи с небольшой недоработкой компилятора. В результате будет напечатано Bar, т.к. 0 будет значением Foo.

    using System;
    
    class Test
    {
        enum Foo { Bar, Baz };
        
        const int One = 1;
        const int Une = 1;
        
        static void Main()
        {
            Foo f = One-Une;
            Console.WriteLine(f);
        }
    } 

    Результат: Данный пример не будет компилироваться под C#2.0, но прекрасно компилируется под C#3.0. Это известная особенность, объяснить это можно тем, что оптимизированный алгоритм выполняет вычисления значения One-Une раньше, а следовательно перечисление даёт своё значение по-умолчанию 0.

  6. Вывод типа

    Какой же вариант будет выведен на экран?

    using System;
    
    class Test
    {
        static void Main()
        {
            Foo("Hello");
        }
        
        static void Foo(object x)
        {
            Console.WriteLine("object");
        }
        
        static void Foo<T>(params T[] x)
        {
            Console.WriteLine("params T[]");
        }
    } 

    Результат: params T[] будет напечатан. Но почему же компилятор выбирает создание массива, хотя в этом нет надобности? Этому есть две причины. Во-первых при выборе перегруженных методов T будет рассматриваться как System.String. Ничего страшного пока в этом нет.

    Однако при выборе “лучшего” метода среди параметров string x and params string[],x формально будет приоритетнее. Однако с нашей точки зрения эффективности выбор между object x и params string[] x падёт на метод с params string[] x в связи с тем, что он не требует преобразований типов.

Материалы

 

  1. Подготовлено по материалам http://www.yoda.arachsys.com/csharp/teasers-answers.html
  2. А так же http://martinfowler.com/

Новая возможность .NET Reflector™

Вступление

Какой же всё-таки отличный этот Codeplex, чего там только нет. Сегодня обнаружил очень полезный плагин для рефлектора – он генерирует проекты для Visual Studio из сборки, загруженной в рефлектор, думаю переоценить насколько это полезно очень сложно.

Демонстрация

Так выглядит этот плагин в рефлекторе

Установка

Для того, чтобы воспользоваться этим замечательным дополнением нужно:

  1. Скачать поселднюю версию плагина по адресу http://www.codeplex.com/FileGenReflector
  2. Извлечь содержимое архива в папку с рефлектором
  3. Добавить FileGenerator.dll в Add-In’ы
  4. Попробовать и удивиться, что это работает 😉

Всем приятного кодинга!


Головоломки на C#

Вступление

 

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

В данной статье я хочу привести несколько примеров немного неожиданного поведения конструкций на C#.

Примеры

Ниже приведены 6 примеров немного нестандартных ситуаций, но довольно интересные для ознакомления:

  1. Перегрузка

    Как вы думаете что выведет данный код и почему?

    using System;
    class Base
    {
    public virtual void Foo(int x)
        {
            Console.WriteLine ("Base.Foo(int)");
        }
    }
    class Derived : Base
    {
    public override void Foo(int x)
        {
            Console.WriteLine ("Derived.Foo(int)");
        }
    public void Foo(object o)
        {
            Console.WriteLine ("Derived.Foo(object)");
        }
    }
    class Test
    {
    static void Main()
        {
            Derived d = new Derived();
    int i = 10;
            d.Foo(i);
        }
    }
  2. Порядок! Порядок!

    В каком порядке напечатаются строки на экране?

    using System;
    class Foo
    {
    static Foo()
        {
            Console.WriteLine ("Foo");
        }
    }
    class Bar
    {
    static int i = Init();
    static int Init()
        {
            Console.WriteLine("Bar");
    return 0;
        }
    }
    class Test
    {
    static void Main()
        {
            Foo f = new Foo();
            Bar b = new Bar();
        }
    }
  3. “Глупая” арифметика

    Компьютеры призваны помочь нам с арифметическими вычислениями, но почему тогда это выражение выводит false?

    double d1 = 1.000001;
    double d2 = 0.000001;
    Console.WriteLine((d1-d2)==1.0);


    А такой вариант?

    double sum = 0;
    for (int i =0;i<10 ;i++ )
    {
      sum+=0.1;
    }
    Console.WriteLine(sum==1.0);
  4. Печать, печать, печать

    Ниже приведен код, использующий анонимные методы, каков будет результат его исполнения?

    using System;
    using System.Collections.Generic;
    class Test
    {
    delegate void Printer();
    static void Main()
        {
            List<Printer> printers = new List<Printer>();
    for (int i=0; i < 10; i++)
            {
                printers.Add(delegate { Console.WriteLine(i); });
            }
    foreach (Printer printer in printers)
            {
                printer();
            }
        }
    }
  5. Ничего странного с компилятором тут не случилось

    Этот код скомпилится? Как это? Что бы это значило?

    using System;
    class Test
    {
    enum Foo { Bar, Baz };
    static void Main()
        {
            Foo f = 0.0;
            Console.WriteLine(f);
        }
    }


    А как Вам такой вариант?

    using System;
    class Test
    {
    enum Foo { Bar, Baz };
    const int One = 1;
    const int Une = 1;
    static void Main()
        {
            Foo f = One-Une;
            Console.WriteLine(f);
        }
    }
  6. Вывод типа

    Какой же вариант будет выведен на экран?

    using System;
    class Test
    {
    static void Main()
        {
            Foo("Hello");
        }
    static void Foo(object x)
        {
            Console.WriteLine("object");
        }
    static void Foo<T>(params T[] x)
        {
            Console.WriteLine("params T[]");
        }
    }

Материалы

Подготовлено по материалам http://www.yoda.arachsys.com/csharp/teasers.html

Ответы на поставленные задачи будут в следующем посте.