Сообщения

.NET Framework: Слабо документированная фича инициализаторов C#, граничущая с приличиями.

Решарпер наткнул меня на следующий интересный случай. Я порылся и ничего не нашел в MSDN. Это относиться к .NET Framework 3.0 и длалее.   Оказывается запись var classLevelOne = new ClassLevelOne {     PropClassLevelTwoInOne =     {         ClassLevelThreeInTwo = new ClassLevelThree ()      } }; Не тоже самое, что запись var classLevelOne = new ClassLevelOne {     PropClassLevelTwoInOne =  new PropClassLevelTwo     {         ClassLevelThreeInTwo = new ClassLevelThree ()      } };   Первая запись говорит о том, что нужно не задать, а взять из свойства (PropClassLevelTwoInOne ) уже заданный там ранее объект и задать члены этого объекта. Как я понимаю, объект в этом свойстве нужно задать ранее в конструкторе или в этом же "скобочном" инициализаторе.   Я был немного шокирован, но дебаггинг не дал соврать, потому что выпадает исключение, если свойтсво PropClassLevelTwoInOne ссылается на null.   А ответ удалось найти в спецификации языка ...

WPF: Баг проекта WPF в Visual Studio при работе с ресурсными файлами.

Речь о проекте WPF в Visual Studio.   Есть файлы которые компилируются в сборку. Ресурсные файлы. У них в свойствах в Build Action стоит Resource. С ними нужно быть осторожным, т.к. при удалении такого файла из проекта или при изменении Build Action на None ничего не меняется. Грубо говоря этот файл останется у вас в ресурсе. Возможно если вы подмените этот файл, то новый файл не подхватиться (не пробовал).   Для решения этой проблемы, после каждого изменения с ресурсными файлами, выполните очистку проекта или всего солюшена - Clean из контекстного меню в Solution Explorer. Только тогда все подхвытывается корректно, иначе вы можете получить исключение при обращении к ресурсу или ненужное утяжеление проекта ресурсными файлами, которые более не нужны.   Видел это в VS 2008, в 2010 не пробовал. Я думаю это относится не только к проектам WPF.

Silverlight: The "ValidateXaml" task failed unexpectedly.

Ошибка возникает при компиляции солюшена с проектом Silverlight в Visual Stusio. Такая ошибка связана с тем, что в вашем GAC появилась сборка из Silverlight или из Silverlight Toolkit. Удаляйте эту сборку из GAC и все заработает. Гугл тоже согласен с таким решением. Обычно это сборки с версией 2.0.5.0. Имейте ввиду, что в GAC может быть совсем не та сборка, которая указана в ошибке. Может произойти так: В GAC уже лежат сборки, относящиеся к Slverlight, которые ссылаются на другие сборки, которых в GAC нет.   Полный текст ошибки, который был у меня: Error 1 The "ValidateXaml" task failed unexpectedly. System.IO.FileNotFoundException: Could not load file or assembly 'System.Windows, Version=2.0.5.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e' or one of its dependencies. Не удается найти указанный файл. File name: 'System.Windows, Version=2.0.5.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e'    at System.ModuleHandle.ResolveType(Int32 typeToken, Runtim...

Как добавить сайт в Bing.

Для добавления в Bing вы можете воспользоваться следующей страницей: http://www.bing.com/webmaster/SubmitSitePage.aspx Учтите, только что если вы авторизуетесь с этой страницы с помощью вашего Live ID, то эта страница средиректит на http://www.bing.com/webmaster/WebmasterManageSitesPage.aspx , для регистрации Web-мастера сайта. Введите повторно первую ссылку в браузере, в этом случае, и спокойно регистрируйтесь без заморочек.

Error message: cannot access non-static method in static context.

Вот одна из причин этого сообщения: Инициализация поля происходит вне конструктора, причем при инициализации требуется нестатический метод класса. Пример: Поле класса хранит ссылку на таймер. При инициализации нужно в конструктор таймера передать не статический метод класса, который будет служить обработчиком тиков таймера. В этом случае и возникнет эта ошибка. Нужно инициализацию таймера просто перенести в конструктор класса. Следующий код не даст скомпилироваться: private readonly Timer _timer = new Timer (state => MyMethod(MyParam ), SomeState , Some Interval, Some Interval ); В этом случае нужно переписать так: private readonly Timer _timer; public MyClass() {     _timer = new Timer (state => MyMethod(MyParam ), SomeState , Some Interval, Some Interval ); } .

Silverlight: Как определить активно ли приложение / окно Silverlight, имеет ли оно фокус.

Silverlight 3. У меня был некий перерыв в работе с Silveright и что-то я не вспомнил, как определить, что окно / приложение Silverlight активно или нет. И сделать это нужно вне зависимости, браузерное это приложение Silverlight или это "Out Of Brouser", всю страницу в браузере это занимает или нет.   Проблема в том, что события LostFocus и GotFocus не дают возможности определить, что приложение активно или нет.   Пока я это сделал через отслеживание событий на корневом элементе - Application .Current.RootVisual .   Если вы мне подсажете / напомните, как это определять более красиво, то буду вам очень благодарен.   Конечно я это не тестировал на всех вариантах работы Silverlight, но полагаю, что это должно работать.   Идея следующая, например, для определения того, что приложение не активно: Если после события потери фокуса происходит событие MouseLeave, то значит приложение перестало быть активным. Любое же событие получение фокуса говорит о том, что приложени стало активным.

Silverlight: Популярный вариант утечки памяти связанный с динамическиизменяемым деревом элементов приложения Silverlight.

Изображение
Нужно помнить следующий вариант утечки памяти, т.к., как мне кажется, он один из самых частых. Вы создали элемент. (Все, забудьте в WPF / Silverlight слово "контрол"  ). Вы добавляете этот элемент динамически в дерево элементов приложения Silverlight. По действию пользователя вы заменяете этот элемент его новым инстансом (экземпляром). Все красиво работает, все заменяется и потом удаляется сборщиком мусора, но до тех пор, пока вы не привяжете методы экземпляра вашего элемента, как обработчики событий элементов, постоянно находящихся в иерерхии элементов вашего Silverlight приложения. Например, очень часто нужно реагировать на события Application .Current.RootVisual . ! Будте внимательны. Как только вы начинаете использовать элемент, как динамически добавляемый / заменяемый / удаляемый, то вы больше не может (не имеете права) привязывать методы его экземпляра к событиям элементов постоянно находящихся в иерархии приложе...