<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>.NET Framework</title><link>http://relib.com/blogs/bazile/category/47.aspx</link><description>.NET Framework</description><managingEditor>Василий Петрухин</managingEditor><dc:language>ru-RU</dc:language><generator>.Text Version 0.95.2004.102</generator><item><dc:creator>Василий Петрухин</dc:creator><title>Несколько интересных советов из книги Рихтера CLR via С#</title><link>http://relib.com/blogs/bazile/archive/2007/04/12/tips_from_clr_via_csharp.aspx</link><pubDate>Thu, 12 Apr 2007 11:20:00 GMT</pubDate><guid>http://relib.com/blogs/bazile/archive/2007/04/12/tips_from_clr_via_csharp.aspx</guid><wfw:comment>http://relib.com/blogs/bazile/comments/10924.aspx</wfw:comment><comments>http://relib.com/blogs/bazile/archive/2007/04/12/tips_from_clr_via_csharp.aspx#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://relib.com/blogs/bazile/comments/commentRss/10924.aspx</wfw:commentRss><trackback:ping>http://relib.com/blogs/bazile/services/trackbacks/10924.aspx</trackback:ping><description>&lt;P&gt;Недавно купил себе книгу Джеффри Рихтера &lt;A href="http://www.biblion.ru/cgi-bin/WebObjects/shop.woa/wa/aspurl?pid=129&amp;amp;sku=459910"&gt;CLR via C#. Программирование на платформе Microsoft.NET Framework 2.0 на языке C#&lt;/A&gt;. Начал читать с самого начала несмотря на то что там объясняются базовые принципы .NET Framework/CLR/C# с которыми я уже знаком. Решил таким образом освежить знания. По ходу чтения наткнулся на пару новых моментов, которыми и хочу поделиться.&lt;/P&gt;
&lt;OL&gt;
&lt;LI&gt;В C# можно делать структуры с перекрывающимеся полями. В С++ это известно как union.&lt;PRE class=codeSample&gt;&lt;CODE&gt;[StructLayout(LayoutKind.Explicit, Size=4)]&lt;BR&gt;public struct Int32Union&lt;BR&gt;{&lt;BR&gt;    [FieldOffset(0)]public byte Byte1;&lt;BR&gt;    [FieldOffset(1)]public byte Byte2;&lt;BR&gt;    [FieldOffset(2)]public byte Byte3;&lt;BR&gt;    [FieldOffset(3)]public byte Byte4;&lt;BR&gt;    [FieldOffset(0)]public int  intValue;&lt;BR&gt;}&lt;/CODE&gt;&lt;/PRE&gt;
&lt;LI&gt;
&lt;P&gt;Если у вас есть сборка с internal классами и требуется предоставить другой своей сборке доступ к ним (а объединить эти сборку в одну нельзя по тем или иным причинам), то вас спасет атрибут InternalsVisibleTo&lt;/P&gt;
&lt;LI&gt;Для проверки хватит ли программе памяти для выполнения, можно использовать класс MemoryFailPoint. Он проверит можно ли выделить необходимый объем памяти в мегабайтах без возбуждения исключения OutOfMemoryException. Вместо него используется InsufficientMemoryException.&lt;/LI&gt;&lt;/OL&gt;
&lt;P&gt;Несколько замечаний о самой книге. Радует то что книга в красивом твердом переплете. Однако растроил уровень перевода и рецензирования. Как видно над книгой работал коллектив переводчиков и поэтому некоторые термины переводятся в начале и конце книги по разному. Например, термин working set в начале книги переводится как "рабочее множество", а в конце как "рабочий набор". Последний перевод я считаю более правильным и к тому же он уже устоялся.&lt;/P&gt;&lt;img src ="http://relib.com/blogs/bazile/aggbug/10924.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>Василий Петрухин</dc:creator><title>Best Practice Analyzer для ASP.NET</title><link>http://relib.com/blogs/bazile/archive/2007/02/08/best_practice_analyzer_for_aspnet.aspx</link><pubDate>Thu, 08 Feb 2007 14:00:00 GMT</pubDate><guid>http://relib.com/blogs/bazile/archive/2007/02/08/best_practice_analyzer_for_aspnet.aspx</guid><wfw:comment>http://relib.com/blogs/bazile/comments/10544.aspx</wfw:comment><comments>http://relib.com/blogs/bazile/archive/2007/02/08/best_practice_analyzer_for_aspnet.aspx#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://relib.com/blogs/bazile/comments/commentRss/10544.aspx</wfw:commentRss><trackback:ping>http://relib.com/blogs/bazile/services/trackbacks/10544.aspx</trackback:ping><description>&lt;P&gt;Случайно нашел интересный проект на сайте CodePlex - &lt;A href="http://www.codeplex.com/Wiki/View.aspx?ProjectName=BPAEngine"&gt;Microsoft Best Practices Analyzer&lt;/A&gt;. Судя по интерфейсу это единый движок для различных best practices анализаторов. Данный проект идет только с плагином для анализа ASP.NET проектов на предмет соответствия рекомендуемым настройкам безопасности и производительности. Для анализа указывается путь к файлу machine.config, к корневому файлу web.config и к файлу web.config конкретного приложения. Непонятно только анализирует ли утилита вышерасположенные web.config, если приложение наследует часть настроек из родительского(-их) пприложения.&lt;/P&gt;&lt;img src ="http://relib.com/blogs/bazile/aggbug/10544.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>Василий Петрухин</dc:creator><title>Присвоение свойству различных значений в зависимости от браузера в ASP.NET 2</title><link>http://relib.com/blogs/bazile/archive/2007/01/17/10286.aspx</link><pubDate>Wed, 17 Jan 2007 15:59:00 GMT</pubDate><guid>http://relib.com/blogs/bazile/archive/2007/01/17/10286.aspx</guid><wfw:comment>http://relib.com/blogs/bazile/comments/10286.aspx</wfw:comment><comments>http://relib.com/blogs/bazile/archive/2007/01/17/10286.aspx#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://relib.com/blogs/bazile/comments/commentRss/10286.aspx</wfw:commentRss><trackback:ping>http://relib.com/blogs/bazile/services/trackbacks/10286.aspx</trackback:ping><description>&lt;P&gt;Недавно узнал что в ASP.NET можно назначать разные значения свойствам для элементов управления и директив. Например, в директиве @ Page можно написать: &amp;lt;%@ Page MasterPageFile="~/Default.master" ie:MasterPageFile="~/Default_ie.master" %&amp;gt;. Такая запись указывает, что для MSIE будет использоваться отдельный MasterPage и другой для всех остальных. Префикс ie в данном случае называется device identifier и соответствует значению атрибута id из файлов *.browser. Они находятся в папке %systemroot%\Microsoft.NET\Framework\v2.0.50727\CONFIG\Browsers\. При необходимости можно создать свой browser файл и выложить его в папку App_Browsers в корне приложения.&lt;/P&gt;
&lt;P&gt;Подобный синтаксис может использоваться в директивах @ Control и @ Master, а также для свойств элементов управления. Смотрите &lt;A href="http://weblogs.asp.net/scottgu/archive/2004/11/20/267362.aspx"&gt;примеры&lt;/A&gt; в блоге Скота Гатри (Scott Guthrie). Документация этой возможности есть в статье MSDN &lt;A href="http://msdn2.microsoft.com/en-us/library/ms178620(VS.80).aspx"&gt;ASP.NET Device Filtering Overview&lt;/A&gt;.&lt;/P&gt;&lt;img src ="http://relib.com/blogs/bazile/aggbug/10286.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>Василий Петрухин</dc:creator><title>В .NET появится поддержка чисел с большой разрядностью.</title><link>http://relib.com/blogs/bazile/archive/2007/01/17/system_numeric_biginteger.aspx</link><pubDate>Wed, 17 Jan 2007 14:21:00 GMT</pubDate><guid>http://relib.com/blogs/bazile/archive/2007/01/17/system_numeric_biginteger.aspx</guid><wfw:comment>http://relib.com/blogs/bazile/comments/10260.aspx</wfw:comment><comments>http://relib.com/blogs/bazile/archive/2007/01/17/system_numeric_biginteger.aspx#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://relib.com/blogs/bazile/comments/commentRss/10260.aspx</wfw:commentRss><trackback:ping>http://relib.com/blogs/bazile/services/trackbacks/10260.aspx</trackback:ping><description>&lt;P&gt;В библиотеке классов .NET Framework &lt;A href="http://blogs.msdn.com/bclteam/archive/2007/01/16/introducing-system-numeric-biginteger-inbar-gazit.aspx"&gt;появится&lt;/A&gt; новый класс System.Numeric.BigInteger поддерживающий числа с большой разрядностью. В примере можно увидеть класс вычисляющий факториал числа 300.&lt;/P&gt;&lt;img src ="http://relib.com/blogs/bazile/aggbug/10260.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>Василий Петрухин</dc:creator><title>Книга Рихтера CLR via С# на русском</title><link>http://relib.com/blogs/bazile/archive/2006/12/02/7637.aspx</link><pubDate>Sat, 02 Dec 2006 14:34:00 GMT</pubDate><guid>http://relib.com/blogs/bazile/archive/2006/12/02/7637.aspx</guid><wfw:comment>http://relib.com/blogs/bazile/comments/7637.aspx</wfw:comment><comments>http://relib.com/blogs/bazile/archive/2006/12/02/7637.aspx#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://relib.com/blogs/bazile/comments/commentRss/7637.aspx</wfw:commentRss><trackback:ping>http://relib.com/blogs/bazile/services/trackbacks/7637.aspx</trackback:ping><description>Издательский дом Питер представил книгу Джеффри Рихтера &lt;A href="http://shop.piter.com/book/978591180303/"&gt;CLR via C#. Программирование на платформе Microsoft .NET Framework 2.0 на языке C#&lt;/A&gt;. Предварительная цена составляет 585 рублей и может измениться после выхода книги из типографии.&lt;img src ="http://relib.com/blogs/bazile/aggbug/7637.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>Василий Петрухин</dc:creator><title>Разница между .NET 1.1 и .NET 2.0 в кешировании регулярных выражений</title><link>http://relib.com/blogs/bazile/archive/2006/10/20/regex_caching_changes_between_netframework11_and_netframework20.aspx</link><pubDate>Fri, 20 Oct 2006 20:13:00 GMT</pubDate><guid>http://relib.com/blogs/bazile/archive/2006/10/20/regex_caching_changes_between_netframework11_and_netframework20.aspx</guid><wfw:comment>http://relib.com/blogs/bazile/comments/6873.aspx</wfw:comment><comments>http://relib.com/blogs/bazile/archive/2006/10/20/regex_caching_changes_between_netframework11_and_netframework20.aspx#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://relib.com/blogs/bazile/comments/commentRss/6873.aspx</wfw:commentRss><trackback:ping>http://relib.com/blogs/bazile/services/trackbacks/6873.aspx</trackback:ping><description>В блоге разработчиков BCL опубликована хорошая заметка &lt;A href="http://blogs.msdn.com/bclteam/archive/2006/10/19/regex-class-caching-changes-between-net-framework-1-1-and-net-framework-2-0-josh-free.aspx"&gt;Regex Class Caching Changes between .NET Framework 1.1 and .NET Framework 2.0&lt;/A&gt;. Если кратко, то кеш теперь имеет фиксированный размер (его можно изменить с помощью свойства &lt;A href="http://msdn2.microsoft.com/en-us/library/system.text.regularexpressions.regex.cachesize(VS.80).aspx"&gt;Regex.CacheSize&lt;/A&gt;) и&amp;nbsp;в него заносятся только регулярные выражения созданные с помощью статических методов класса Regex.&lt;img src ="http://relib.com/blogs/bazile/aggbug/6873.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>Василий Петрухин</dc:creator><title>Поддержка переменных в локальной памяти потока в .NET Framework</title><link>http://relib.com/blogs/bazile/archive/2006/09/24/thread_local_variable_in_dotnet_framework.aspx</link><pubDate>Sun, 24 Sep 2006 16:12:00 GMT</pubDate><guid>http://relib.com/blogs/bazile/archive/2006/09/24/thread_local_variable_in_dotnet_framework.aspx</guid><wfw:comment>http://relib.com/blogs/bazile/comments/6496.aspx</wfw:comment><comments>http://relib.com/blogs/bazile/archive/2006/09/24/thread_local_variable_in_dotnet_framework.aspx#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://relib.com/blogs/bazile/comments/commentRss/6496.aspx</wfw:commentRss><trackback:ping>http://relib.com/blogs/bazile/services/trackbacks/6496.aspx</trackback:ping><description>&lt;P&gt;Windows поддерживает понятие глобальных переменных действующих в рамках отдельного потока. Называется это &lt;A href="http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dllproc/base/thread_local_storage.asp?frame=true"&gt;Thread Local Storage&lt;/A&gt; (TLS) или локальная память потока. До сегодняшнего дня я не подозревал о наличии поддержки TLS в .NET Framework. Применив атрибут &lt;A href="http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpref/html/frlrfsystemthreadstaticattributeclasstopic.asp?frame=true"&gt;ThreadStatic&lt;/A&gt; к статической переменной мы автоматически получаем необходимый результат. В MSDN Magazine за сентябрь 2006 года опубликована статья &lt;A href="http://msdn.microsoft.com/msdnmag/issues/06/09/NETMatters/default.aspx"&gt;.NET Matters: Scope&amp;lt;T&amp;gt; and More&lt;/A&gt; с хорошими примерами по теме. Рекомендую прочитать.&lt;/P&gt;&lt;img src ="http://relib.com/blogs/bazile/aggbug/6496.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>Василий Петрухин</dc:creator><title>Интересный пример неработающего кода</title><link>http://relib.com/blogs/bazile/archive/2006/09/12/6265.aspx</link><pubDate>Tue, 12 Sep 2006 19:43:00 GMT</pubDate><guid>http://relib.com/blogs/bazile/archive/2006/09/12/6265.aspx</guid><wfw:comment>http://relib.com/blogs/bazile/comments/6265.aspx</wfw:comment><comments>http://relib.com/blogs/bazile/archive/2006/09/12/6265.aspx#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://relib.com/blogs/bazile/comments/commentRss/6265.aspx</wfw:commentRss><trackback:ping>http://relib.com/blogs/bazile/services/trackbacks/6265.aspx</trackback:ping><description>&lt;P&gt;Скотт Аллен опубликовал интересный пример неработающего кода в заметке &lt;A href="http://odetocode.com/Blogs/scott/archive/2006/09/11/6546.aspx"&gt;What's Wrong With This Code (#5)&lt;/A&gt;. На данный момент в комментариях уже есть правильный ответ почему код не работает и как это исправить. Я, честно говоря, не смог догадаться. Пример мне очень понравился поэтому приведу его здесь. Он состоит из двух частей.&lt;/P&gt;
&lt;P&gt;Часть 1. Два простых класса:&lt;/P&gt;&lt;PRE class=codeSample&gt;&lt;CODE&gt;using System;
using System.Collections.Generic;

[Serializable]
class Bowlers
{
    List&amp;lt;string&amp;gt; _bowlerList = new List&amp;lt;string&amp;gt;();

    public void AddBowler(string name)
    {
        _bowlerList.Add(name);

        EventHandler&amp;lt;BowlerAddedEventArgs&amp;gt; handler = BowlerAdded;
        if (handler != null)
        {
            handler(this, new BowlerAddedEventArgs(name));
        }
    }

    public event EventHandler&amp;lt;BowlerAddedEventArgs&amp;gt; BowlerAdded;

    // ...
}


[Serializable]
class BowlerAddedEventArgs : EventArgs
{
    public BowlerAddedEventArgs(string name)
    {
        Name = name;
    }

    public string Name;
}&lt;/CODE&gt;&lt;/PRE&gt;
&lt;P&gt;Часть 2. Программа использующая их:&lt;/P&gt;&lt;PRE class=codeSample&gt;&lt;CODE&gt;using System;
using System.IO;
using System.Runtime.Serialization.Formatters.Binary;
class Test
{
    public static void Main()
    {
        Bowlers bowlers = new Bowlers();
        string addedMessage = "Added bowler: {0}";
        bowlers.BowlerAdded +=
            delegate(object sender, BowlerAddedEventArgs e)
            {
                Console.WriteLine(addedMessage, e.Name);
            };

        bowlers.AddBowler("Bob");
        bowlers.AddBowler("Jan");
        bowlers.AddBowler("Ann");

        using (MemoryStream stream = new MemoryStream())
        {
            BinaryFormatter formatter = new BinaryFormatter();
            formatter.Serialize(stream, bowlers);
        }
    }
}&lt;/CODE&gt;&lt;/PRE&gt;
&lt;P&gt;При выполнении программы выдается исключение. Почему? Ответ: &lt;SPAN style="BACKGROUND: #000; COLOR: #000"&gt;Проблема в том, что анонимный делегат обращается к переменным вне своей области видимости. Компилятор C# генерирует для него класс без атрибута [Serializable], а так как событие является public, то происходит попытка выполнить его сериализацию. При этом так как класс в данном поле не является сериализуемым, то выдается исключение. Исправить это можно перенеся переменную addedMessage внутрь делегата или пометив событие BowlerAdded атрибутом [field: NonSerialized]&lt;/SPAN&gt;.&lt;/P&gt;&lt;img src ="http://relib.com/blogs/bazile/aggbug/6265.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>Василий Петрухин</dc:creator><title>Как определить програмным путем в каком режиме (debud или release) откомпилирована сборка</title><link>http://relib.com/blogs/bazile/archive/2006/08/31/6103.aspx</link><pubDate>Thu, 31 Aug 2006 14:05:00 GMT</pubDate><guid>http://relib.com/blogs/bazile/archive/2006/08/31/6103.aspx</guid><wfw:comment>http://relib.com/blogs/bazile/comments/6103.aspx</wfw:comment><comments>http://relib.com/blogs/bazile/archive/2006/08/31/6103.aspx#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://relib.com/blogs/bazile/comments/commentRss/6103.aspx</wfw:commentRss><trackback:ping>http://relib.com/blogs/bazile/services/trackbacks/6103.aspx</trackback:ping><description>&lt;P&gt;Вопрос определения режима компиляции програмным путем интересовал меня уже давно и благодаря Скотту Хансельману (Scott Hanselman) ответ найден: &lt;A href="http://www.hanselman.com/blog/HowToProgrammaticallyDetectIfAnAssemblyIsCompiledInDebugOrReleaseMode.aspx"&gt;How to Programmatically Detect if an Assembly is Compiled in Debug or Release mode&lt;/A&gt;. Спасибо Скотт!&lt;/P&gt;
&lt;P&gt;Эту методику можно использовать как в обычном приложении так и в приложении ASP.NET. Замените вызов Assembly.LoadFrom на Assembly.GetExecutingAssembly или Assembly.GetCallingAssembly. Результат работы кода внутри приложения ASP.NET зависит не только от режима компиляции самой сборки, но и параметра debug из файла web.config.&lt;/P&gt;
&lt;P&gt;[обновление от 22 января 2007г] В ASP.NET работу в режиме отладки можно определить с помощью HttpContext.Current.IsDebuggingEnabled. (&lt;A href="http://west-wind.com/weblog/posts/10228.aspx"&gt;источник&lt;/A&gt;)&lt;/P&gt;&lt;img src ="http://relib.com/blogs/bazile/aggbug/6103.aspx" width = "1" height = "1" /&gt;</description></item></channel></rss>