<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Chris Fulstow &#187; .net</title>
	<atom:link href="http://chrisfulstow.com/category/net/feed/" rel="self" type="application/rss+xml" />
	<link>http://chrisfulstow.com</link>
	<description>ASP.NET Tech Lead and Web Developer</description>
	<lastBuildDate>Sat, 05 Jun 2010 01:32:55 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.1</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Counting blank lines in a large text file with C# and .NET</title>
		<link>http://chrisfulstow.com/counting-blank-lines-in-a-large-text-file-with-csharp-and-dotnet/</link>
		<comments>http://chrisfulstow.com/counting-blank-lines-in-a-large-text-file-with-csharp-and-dotnet/#comments</comments>
		<pubDate>Sun, 16 May 2010 03:30:58 +0000</pubDate>
		<dc:creator>Chris Fulstow</dc:creator>
				<category><![CDATA[.net]]></category>
		<category><![CDATA[c#]]></category>

		<guid isPermaLink="false">http://chrisfulstow.com/?p=326</guid>
		<description><![CDATA[There are a few different ways in .NET to count the number of blank lines in a text file, but which is the most efficient?
To test some different approaches, I&#8217;ve written this function to create a huge text file with some empty lines.  To verify that my counting functions give correct results, I need this <a href="http://chrisfulstow.com/counting-blank-lines-in-a-large-text-file-with-csharp-and-dotnet/" class="more-link">More &#62;</a>]]></description>
			<content:encoded><![CDATA[<p>There are a few different ways in .NET to count the number of blank lines in a text file, but which is the most efficient?</p>
<p>To test some different approaches, I&#8217;ve written this function to create a huge text file with some empty lines.  To verify that my counting functions give correct results, I need this function to create a file with a specific number of blank lines.</p>
<pre class="brush: csharp;">
private static void BuildFileWithBlankLines(string path, uint blanks)
{
    var random = new Random();
    var counter = 0;

    using (var sw = File.CreateText(path))
    {
        while (counter &lt; blanks)
        {
            var isBlank = (random.Next(100) == 0);  // ~1% of lines blank
            sw.WriteLine(isBlank ? &quot;&quot; : &quot;NOT BLANK&quot;);
            if (isBlank) { counter++; }
        }
    }
}
</pre>
<p>For my test, I&#8217;ve used 250,000 empty lines, which outputs a file just over 250 MB.  This should be big enough to expose the differences between counting methods.</p>
<h3>1. Regular expression matching in memory</h3>
<pre class="brush: csharp;">
var content = File.ReadAllText(path);
var re = new Regex(@&quot;^\r?\n&quot;, RegexOptions.Multiline);
var count = re.Matches(content).Count;
</pre>
<p>This technique loads the whole text file into a string variable using <a href="http://msdn.microsoft.com/en-us/library/ms143368.aspx">File.ReadAllText</a>, which is really just a wrapper for <a href="http://msdn.microsoft.com/en-us/library/system.io.streamreader.readtoend.aspx">StreamReader.ReadToEnd.</a> It loads the character bytes from a file stream into a <a href="http://msdn.microsoft.com/en-us/library/system.text.stringbuilder.aspx">StringBuilder</a>.  The load is relatively quick, taking about 8% of the total processing time.  Once the file is loaded into memory, a regular expression finds and counts all the blank lines. This is, not surprisingly, glacially slow.  Total duration was 16,531 ms.</p>
<h3>2. Counting line by line through a string array</h3>
<pre class="brush: csharp;">
var count = File.ReadAllLines(path).Count(s =&gt; s.Length == 0);
</pre>
<p>I like this approach because it&#8217;s simple and readable.  The first step is similar to the above, but this time uses a StreamReader (via <a href="http://msdn.microsoft.com/en-us/library/s2tte0y1.aspx">File.ReadAllLines</a>) to load the file into a string array, rather than into a single string. <a href="http://msdn.microsoft.com/en-us/library/bb535181(v=VS.100).aspx">IEnumerable.Count</a> then loops through the array and tries to match each line against a predicate that checks for empty strings.  This takes less than half the time of the regex approach, only 7,006 ms.</p>
<h3>3. Streaming through the file</h3>
<pre class="brush: csharp;">
uint count = 0;
using (var sr = File.OpenText(path))
{
    string line;
    while ((line = sr.ReadLine()) != null)
    {
        if (line.Length == 0) { count++; }
    }
}
</pre>
<p>Unlike the first two, this last approach doesn&#8217;t load the entire file into memory.  It uses <a href="http://msdn.microsoft.com/en-us/library/z13csk76(v=VS.100).aspx">File.OpenText</a> to create a new StreamReader, then reads each line from the FileStream counting blank lines as it goes along.  This is blazing fast compared to the other two, taking just 2,108 ms.</p>
<h3>Conclusion</h3>
<p>There&#8217;s almost an order of magnitude difference between the best and worst methods.  So if you&#8217;re working with large files, try not to load them into memory first, but stream directly from disk instead.</p>
<p><img src="http://chart.apis.google.com/chart?cht=bhs&amp;chd=t:16531,7006,2108&amp;chs=400x150&amp;chds=0,20000&amp;chco=FF0000|FF9E0C|21B703&amp;chxt=x,y&amp;chxr=0,0,20000&amp;chxl=1:|Stream|String array|Regex&amp;chbh=a" alt="Test speeds" /></p>
<p>This applies especially to parsing large data files before loading them into a database.  In some cases, it&#8217;s not just slow to load into memory first, but impossible.</p>
<p>For example, a 500 GB XML file wouldn&#8217;t load easily into an <a href="http://msdn.microsoft.com/en-us/library/system.xml.linq.xdocument.aspx">XDocument</a>, but could be streamed with an <a href="http://msdn.microsoft.com/en-us/library/system.xml.xmlreader.aspx">XmlReader</a> and parsed with <a href="http://msdn.microsoft.com/en-us/library/system.xml.linq.xnode.readfrom.aspx">XNode.ReadFrom</a>. Similarly, a huge CSV file couldn&#8217;t be loaded easily into a string then <a href="http://msdn.microsoft.com/en-us/library/system.string.split.aspx">String.Split</a> all in one go.  Instead, you&#8217;d probably parse it line by line with a StreamReader, or use a streaming <a href="http://www.codeproject.com/KB/database/CsvReader.aspx">CsvReader</a> library.</p>
]]></content:encoded>
			<wfw:commentRss>http://chrisfulstow.com/counting-blank-lines-in-a-large-text-file-with-csharp-and-dotnet/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Customising Visual Studio debugger DataTips with DebuggerDisplay</title>
		<link>http://chrisfulstow.com/customising-visual-studio-debugger-datatips-with-debuggerdisplay/</link>
		<comments>http://chrisfulstow.com/customising-visual-studio-debugger-datatips-with-debuggerdisplay/#comments</comments>
		<pubDate>Wed, 17 Feb 2010 23:40:12 +0000</pubDate>
		<dc:creator>Chris Fulstow</dc:creator>
				<category><![CDATA[.net]]></category>
		<category><![CDATA[c#]]></category>

		<guid isPermaLink="false">http://chrisfulstow.com/?p=315</guid>
		<description><![CDATA[The DebuggerDisplay attribute lets you change how an object is displayed in the Visual Studio debugger. Take these two simple classes representing a Company and an Employee.

public class Company
{
    public string Name { get; set; }
    public string StockSymbol { get; set; }
    public IEnumerable&#60;Employee&#62; Employees <a href="http://chrisfulstow.com/customising-visual-studio-debugger-datatips-with-debuggerdisplay/" class="more-link">More &#62;</a>]]></description>
			<content:encoded><![CDATA[<p>The <a href="http://msdn.microsoft.com/en-us/library/system.diagnostics.debuggerdisplayattribute.aspx">DebuggerDisplay</a> attribute lets you change how an object is displayed in the Visual Studio debugger. Take these two simple classes representing a <em>Company</em> and an <em>Employee</em>.</p>
<pre class="brush: csharp;">
public class Company
{
    public string Name { get; set; }
    public string StockSymbol { get; set; }
    public IEnumerable&lt;Employee&gt; Employees { get; set; }
    public Company(string name) { Name = name; }
}

public class Employee
{
    public string Name { get; set; }
    public Employee(string name) { Name = name; }
}
</pre>
<p>Create and initialise a new Company object with some data.</p>
<pre class="brush: csharp;">
var company = new Company(&quot;Microsoft&quot;)
{
    StockSymbol = &quot;MSFT&quot;,
    Employees = new List&lt;Employee&gt;
    {
        new Employee(&quot;Anders Hejlsberg&quot;),
        new Employee(&quot;Steve Ballmer&quot;),
        new Employee(&quot;Scott Guthrie&quot;)
    }
};
</pre>
<p>Now, if you break into the code and start a debug session, you can hover over the company object to reveal its debugger DataTip.  By expanding the nodes you can drill down into the object&#8217;s data.</p>
<p><img class="alignnone size-full wp-image-319" title="Visual Studio debug hover" src="http://chrisfulstow.com/wp-content/uploads/2010/02/debug-hover1.png" alt="Visual Studio debug hover" width="354" height="173" /></p>
<p>The default information shown in the DataTip, although useful, can be improved by decorating classes with the DebuggerDisplay attribute.  For companies, it might be useful to to display their Name and StockSymbol instead of the object type <em>{Company}</em>.</p>
<pre class="brush: csharp;">
[DebuggerDisplay(&quot;{Name} - {StockSymbol}&quot;)]
public class Company
</pre>
<p>The same goes for the Employee object.  We can show the employee name instead of the type <em>{Employee}</em>.</p>
<pre class="brush: csharp;">
[DebuggerDisplay(&quot;{Name}&quot;)]
public class Employee
</pre>
<p>The result is a more useful and descriptive view of your Company objects.</p>
<p><img class="alignnone size-full wp-image-321" title="Visual Studio debug hover" src="http://chrisfulstow.com/wp-content/uploads/2010/02/debug-hover-2.png" alt="Visual Studio debug hover with DebuggerDisplay attribute" width="353" height="190" /></p>
<p>For more info about customising Visual Studio&#8217;s debugger DataTips, see this article from MSDN Magazine:</p>
<ul>
<li><a href="http://msdn.microsoft.com/en-us/magazine/cc163974.aspx">DataTips, Visualizers and Viewers Make Debugging .NET Code a Breeze</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://chrisfulstow.com/customising-visual-studio-debugger-datatips-with-debuggerdisplay/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Snack size C#: null coalescing operator</title>
		<link>http://chrisfulstow.com/snack-size-c-null-coalescing-operator/</link>
		<comments>http://chrisfulstow.com/snack-size-c-null-coalescing-operator/#comments</comments>
		<pubDate>Sat, 13 Feb 2010 00:08:04 +0000</pubDate>
		<dc:creator>Chris Fulstow</dc:creator>
				<category><![CDATA[.net]]></category>
		<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[c#]]></category>

		<guid isPermaLink="false">http://chrisfulstow.com/?p=289</guid>
		<description><![CDATA[You need to assign the value of an expression to a variable, unless that expression evaluates to null, in which case default to something else.  And if that something else is also null, then fall back to another value, and so on.
For example, a web page that uses a theme setting to control look-and-feel.  If <a href="http://chrisfulstow.com/snack-size-c-null-coalescing-operator/" class="more-link">More &#62;</a>]]></description>
			<content:encoded><![CDATA[<p>You need to assign the value of an expression to a variable, unless that expression evaluates to null, in which case default to something else.  And if that something else is also null, then fall back to another value, and so on.</p>
<p>For example, a web page that uses a theme setting to control look-and-feel.  If the user has selected their own theme then use that; otherwise use the site&#8217;s default theme; or, if that&#8217;s not defined, use the global theme; or finally if no global theme is defined then fall back to a system default.</p>
<h3>The long, readable version</h3>
<p>Using good, old fashioned, conditional logic.</p>
<pre class="brush: csharp;">
string theme;
if (userTheme != null)
{
    theme = userTheme;
}
else if (siteTheme != null)
{
    theme = siteTheme;
}
else if (globalTheme != null)
{
    theme = globalTheme;
}
else
{
    theme = defaultTheme;
}
</pre>
<h3>The shorter, slightly befuddling version</h3>
<p>By nesting the ternary conditional operator in a most disagreeable way.</p>
<pre class="brush: csharp;">
string theme =
    userTheme != null ? userTheme
    : siteTheme != null ? siteTheme
    : globalTheme != null ? globalTheme
    : defaultTheme;
</pre>
<h3>The deluxe C# 3.0 version</h3>
<p>With the overkill of an implicitly-typed array, an IEnumerable extension method, and a lambda predicate.</p>
<pre class="brush: csharp;">
string theme = new [] {
    userTheme, siteTheme, globalTheme, defaultTheme
}.First(t =&gt; t != null);
</pre>
<h3>The elegant coalescence version</h3>
<p>With C# 2.0&#8217;s <a href="http://msdn.microsoft.com/en-us/library/ms173224.aspx">null-coalescing operator</a>, doing what it does best.</p>
<pre class="brush: csharp;">
string theme = userTheme ?? siteTheme ?? globalTheme ?? defaultTheme;
</pre>
]]></content:encoded>
			<wfw:commentRss>http://chrisfulstow.com/snack-size-c-null-coalescing-operator/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>New and upcoming books for ASP.NET developers</title>
		<link>http://chrisfulstow.com/new-and-upcoming-books-for-asp-net-developers/</link>
		<comments>http://chrisfulstow.com/new-and-upcoming-books-for-asp-net-developers/#comments</comments>
		<pubDate>Tue, 02 Feb 2010 06:25:03 +0000</pubDate>
		<dc:creator>Chris Fulstow</dc:creator>
				<category><![CDATA[.net]]></category>
		<category><![CDATA[books]]></category>
		<category><![CDATA[c#]]></category>
		<category><![CDATA[html5]]></category>
		<category><![CDATA[visual studio]]></category>

		<guid isPermaLink="false">http://chrisfulstow.com/?p=246</guid>
		<description><![CDATA[The are some great books in the pipeline for ASP.NET web developers.  Everything from Visual Studio 2010, ASP.NET 4.0, ASP.NET MVC, HTML 5, jQuery 1.4, and even iPhone development.  Not to mention second editions of classic titles like jQuery in Action and C# in Depth.
Got any more? Let me know in the comments.
O&#8217;Reilly
Web Design for <a href="http://chrisfulstow.com/new-and-upcoming-books-for-asp-net-developers/" class="more-link">More &#62;</a>]]></description>
			<content:encoded><![CDATA[<p>The are some great books in the pipeline for ASP.NET web developers.  Everything from Visual Studio 2010, ASP.NET 4.0, ASP.NET MVC, HTML 5, jQuery 1.4, and even iPhone development.  Not to mention second editions of classic titles like <em>jQuery in Action</em> and <em>C# in Depth</em>.</p>
<p>Got any more? Let me know in the comments.</p>
<h2>O&#8217;Reilly</h2>
<p><a href="http://oreilly.com/catalog/9781934356135/">Web Design for Developers &#8211; A Programmer&#8217;s Guide to Design Tools and Techniques</a><em> </em></p>
<p><em>Web Design for Developers</em> will show you how to make your web-based application look professionally designed. We&#8217;ll help you learn how to pick the right colors and fonts, avoid costly interface and accessibility mistakes&#8211;your application will really come alive. We&#8217;ll also walk you through some common Photoshop and CSS techniques and work through a web site redesign, taking a new design from concept all the way to implementation.</p>
<p><a href="http://oreilly.com/catalog/9780596154783/">Effective UI &#8211; The Art of Building Great User Experience in Software</a></p>
<p><em>Effective UI</em> provides a complete roadmap to building groundbreaking software centered on user experience (UX) quality, how to get management support, employing product management strategies proven to deliver greater success, and how to manage the design, engineering, staffing, and business considerations that must be centered on the user&#8217;s needs and working effectively in tandem all throughout the project. Effective UI is a guide for business and product, software professionals, and anyone else struggling to advance the cause of better UX and working to deliver on the promise of higher quality software.</p>
<p><a href="http://oreilly.com/catalog/9780596802271/">Search Patterns</a><br />
Search is among the most disruptive innovations of our time. It influences what we buy and where we go. It shapes how we learn and what we believe. This provocative and inspiring book explores design patterns that apply across the categories of web, ecommerce, enterprise, desktop, mobile, social, and realtime search and discovery. Using colorful illustrations and examples, the authors bring modern information retrieval to life, covering such diverse topics as relevance ranking, faceted navigation, multi-touch, and augmented reality. Search Patterns challenges us to invent the future of discovery while serving as a practical guide to help us make search better today.</p>
<p><a href="http://oreilly.com/catalog/9780596809485/">97 Things Every Programmer Should Know &#8211; Collective Wisdom from the Experts</a><br />
Get 97 short and extremely useful tips from some of the most experienced and respected practitioners in the industry, including Uncle Bob Martin, Scott Meyers, Dan North, Linda Rising, Udi Dahan, Neal Ford, and many more. They encourage you to stretch yourself by learning new languages, looking at problems in new ways, following specific practices, taking responsibility for your work, and becoming as good at the entire craft of programming as you possibly can.</p>
<p><a href="http://oreilly.com/catalog/9780596802790/">High Performance JavaScript</a><br />
Do you want to fix performance bottlenecks in your JavaScript code to help your website function better? With this book, you&#8217;ll examine the typical code problems that cause JavaScript to run slow. High Performance JavaScript teaches you how to identify inefficient structures and patterns, and replace them with better-performing alternatives.</p>
<p><a href="http://oreilly.com/catalog/9780735627147/">Programming Microsoft® ASP.NET MVC</a><br />
Author Dino Esposito leads you through the features, principles, and pillars of the ASP.NET MVC framework, demonstrating how and when to use this model to gain full control of HTML, simplify testing, and design better Web sites and experiences.</p>
<h2>APress</h2>
<p><a href="http://apress.com/book/view/9781430223832">Ultra-Fast ASP.NET: Building Ultra-Fast and Ultra-Scalable Websites Using ASP.NET and SQL Server</a><br />
Ultra-Fast ASP.NET presents a practical approach to building fast and scalable web sites using ASP.NET and SQL Server. In addition to a wealth of tips, tricks and secrets, you&#8217;ll find advice and code examples for all tiers of your application, including the client, caching, IIS 7, ASP.NET, threads, session state, SQL Server, Analysis Services, infrastructure and operations. By applying the ultra-fast approach to your projects, you’ll squeeze every last ounce of performance out of your code and infrastructure—giving your site unrivaled speed.</p>
<p><a href="http://apress.com/book/view/9781430224556">Introducing .NET 4.0: with Visual Studio 2010</a><br />
Microsoft is introducing a large number of changes to the way that the .NET Framework operates. Familiar technologies are being altered, best practices replaced, and developer methodologies adjusted. Many developers find it hard to keep up with the pace of change across .NET&#8217;s ever-widening array of technologies. You may know what&#8217;s happening in C#, but how about the Azure cloud? How is that going to affect your work? What are the limitations of the new pLINQ syntax? What you need is a roadmap. A guide to help you see the innovations that matter and to give you a head start on the opportunities available in the new framework.</p>
<p><a href="http://apress.com/book/view/9781430227908">Pro HTML5 Programming: Powerful APIs for Richer Internet Application Development</a><br />
HTML5 is here, and with it, rich Internet applications (RIAs) take on a power, ease, scalability, and responsiveness that neither Ajax nor Comet could ever achieve. With this book, developers will learn how to use the latest cutting-edge web technology—available in the most recent versions of modern browsers—to build real-time web applications with unparalleled functionality, speed, and responsiveness.</p>
<p><a href="http://apress.com/book/view/9781430228868">Pro ASP.NET MVC V2 Framework</a><br />
Author Steven Sanderson has seen the ASP.NET MVC Framework mature from the start, so his experience, combined with comprehensive coverage of all the new features, including those in the official MVC development toolkit, offers the clearest understanding of how this exciting new framework can improve your coding efficiency. With this book, you’ll gain invaluable up-to-date knowledge of security, deployment, and interoperability challenges.</p>
<p><a href="http://apress.com/book/view/9781430228929">iPhone and Mac OS X Development for Windows Programmers: C#, C++ and C Edition</a><br />
When coming to the iPhone and Mac OS X from Windows, you need to learn a new set of coding techniques and tools. Taken blindly, this can come as a shock—a shock that this book will help you avoid. It does this by teaching you to use your existing Windows programming knowledge to ease you into programming for Apple technologies.</p>
<h2>Manning</h2>
<p><a href="http://www.manning.com/bibeault2/">jQuery in Action, Second Edition</a><br />
A really good web development framework anticipates your needs. jQuery does more—it practically reads your mind. Developers fall in love with this JavaScript library the moment they see 20 lines of code reduced to three. jQuery is concise and readable. Its unique &#8220;chaining&#8221; model lets you perform multiple operations on a page element in succession. And with version 1.4, there&#8217;s even more to love about jQuery, including new effects and events, usability improvements, and more testing options.</p>
<p><a href="http://www.manning.com/baley/">Brownfield Application Development in .NET</a></p>
<p>Brownfield Application Development in .Net shows you how to approach legacy applications with the state-of-the-art concepts, patterns, and tools you&#8217;ve learned to apply to new projects. Using an existing application as an example, this book guides you in applying the techniques and best practices you need to make it more maintainable and receptive to change.</p>
<p><a href="http://www.manning.com/resig/">Secrets of the JavaScript Ninja</a><br />
In Secrets of the JavaScript Ninja, JavaScript expert John Resig reveals the inside know-how of the elite JavaScript programmers. Written to be accessible to JavaScript developers with intermediate-level skills, this book will give you the knowledge you need to create a cross-browser JavaScript library from the ground up.</p>
<p><a href="http://www.manning.com/seemann/">Dependency Injection in .NET</a><br />
Dependency Injection in .NET is a comprehensive guide than introduces DI and provides an in-depth look at applying DI practices to .NET apps. In it, you will also learn to integrate DI together with such technologies as Windows Communication Foundation, ASP.NET MVC, Windows Presentation Foundation and other core .NET components.</p>
<p><a href="http://www.manning.com/skeet2/">C# in Depth, Second Edition</a></p>
<p>C# in Depth, Second Edition concentrates on the high-value features that make C# such a powerful and flexible development tool. Rather than re-hashing the core of C# that&#8217;s essentially unchanged since it hit the scene nearly a decade ago, this book brings you up to speed with the features and practices that have changed with C# from version 2.0 onwards.</p>
<h2>MS Press</h2>
<p><a href="http://www.microsoft.com/learning/en/us/Book.aspx?ID=13220&amp;locale=en-us">Microsoft ASP.NET Internals</a><br />
A comprehensive reference outlining the underpinnings of Microsoft’s Web application environment<br />
Learn how to fully exploit the critical components and rich capabilities of the ASP.NET framework, without scouring blogs for information or enduring hours of trial and error. This comprehensive book offers developers the insights they need—including established architecture patterns—to create better, stronger, faster Web sites and Web-based applications Web services. The book offers readers the guidance they need to take advantage of ASP.NET right away, and outlines the evolution and future of the technology.</p>
<h2>Addison Wesley</h2>
<p><a href="http://www.informit.com/store/product.aspx?isbn=0321637003">LINQ to Objects Using C# 4.0: Using and Extending LINQ to Objects and Parallel LINQ (PLINQ)</a><br />
Using LINQ to Objects, .NET developers can write queries over object collections with the same deep functionality that was once available only with SQL and relational databases. Now, for the first time, developers have a comprehensive and authoritative guide to applying LINQ to Objects in real-world software. Microsoft MVP Troy Magennis introduces state-of-the-art techniques for working with objects more elegantly and efficiently–and writing code that is exceptionally powerful, robust, and flexible.</p>
<p><strong>Updates from comments:</strong></p>
<p><a href="http://www.red-gate.com/products/ants_performance_profiler/care_about_performance_ebook.htm">.NET Performance Testing and Optimization (Part 1)</a></p>
<p><a href="http://weblogs.asp.net/pglavich">Paul  Glavich</a> and Chris Farrell&#8217;s upcoming book on .NET performance testing and optimization will be out in a few weeks, and part one is already as a free e-book.  They explain why performance testing is a good idea, and walk you through everything you need to know about setting up a test environment. An essential handbook for programmers looking to set up a .NET testing environment.</p>
]]></content:encoded>
			<wfw:commentRss>http://chrisfulstow.com/new-and-upcoming-books-for-asp-net-developers/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>.NET Framework 3.5 Reference Poster</title>
		<link>http://chrisfulstow.com/net-framework-35-reference-poster/</link>
		<comments>http://chrisfulstow.com/net-framework-35-reference-poster/#comments</comments>
		<pubDate>Sun, 27 Jan 2008 06:45:14 +0000</pubDate>
		<dc:creator>Chris Fulstow</dc:creator>
				<category><![CDATA[.net]]></category>
		<category><![CDATA[asp.net]]></category>
		<category><![CDATA[c#]]></category>
		<category><![CDATA[programming]]></category>
		<category><![CDATA[vb.net]]></category>
		<category><![CDATA[visual studio]]></category>

		<guid isPermaLink="false">http://3poundmass.wordpress.com/?p=97</guid>
		<description><![CDATA[This slick .NET 3.5 reference poster is available as a free download from MSDN.  It&#8217;s got the most commonly used types and namespaces in the framework.  A great quick reference for any .NET developer&#8217;s office wall:

As it&#8217;s getting progressively harder to keep up with .NET&#8217;s continutally expanding scope, this poster is a handy reminder <a href="http://chrisfulstow.com/net-framework-35-reference-poster/" class="more-link">More &#62;</a>]]></description>
			<content:encoded><![CDATA[<p>This slick <a href="http://www.microsoft.com/downloads/details.aspx?FamilyID=7b645f3a-6d22-4548-a0d8-c2a27e1917f8&amp;DisplayLang=en">.NET 3.5 reference poster</a> is available as a <strong>free download</strong> from MSDN.  It&#8217;s got the most commonly used <strong>types and namespaces</strong> in the framework.  A great quick reference for any .NET developer&#8217;s office wall:</p>
<p><a title=".NET 3.5 Reference Poster" href="http://www.microsoft.com/downloads/details.aspx?FamilyID=7b645f3a-6d22-4548-a0d8-c2a27e1917f8&amp;DisplayLang=en"><img style="border: 1px solid #dddddd;" src="http://chrisfulstow.com/wp-content/uploads/2007/12/dotnet-poster.png" alt=".NET 3.5 Poster" /></a></p>
<p>As it&#8217;s getting progressively harder to keep up with <a href="http://asp.net/downloads/3.5-extensions/">.NET&#8217;s continutally expanding scope</a>, this poster is a handy reminder of what&#8217;s included.  It shows which classes were added in .NET 3.0, and which in .NET 3.5.</p>
<p>There&#8217;s a broad cross-section across all areas of the .NET Framework:</p>
<ul>
<li>ASP.NET</li>
<li>WinForms and WPF</li>
<li>Communications and Workflow</li>
<li>Data, XML and LINQ</li>
<li>Fundamentals</li>
</ul>
<p><span style="text-decoration: underline;"><strong>Printing</strong></span></p>
<p>The hi-res version is Microsoft <a href="http://en.wikipedia.org/wiki/XML_Paper_Specification">XPS</a> format, so if you&#8217;re not using Vista or Office 2007 then you might want the <a href="http://www.microsoft.com/whdc/xps/viewxps.mspx">Microsoft XPS Viewer</a>. Also, for &#8216;easy printing&#8217;, there&#8217;s a 16 page 4&#215;4 version, but remember: &#8217;some assembly is required if you choose this print method&#8217;, so remember to ask an adult for help with the scissors.</p>
<p>My local print shop printed and laminated the PDF version onto A1, which is easily hi-res enough and looks great.</p>
<p><span style="text-decoration: underline;"><strong>Other .NET Reference Posters</strong></span></p>
<p>There are a few other reference posters on MSDN, in particular I like the <a href="http://www.microsoft.com/downloads/details.aspx?FamilyID=811d8ad6-8d48-4684-b08c-686462d58a56&amp;DisplayLang=en">Silverlight Developer Reference</a>, and <strong>keyboard shortcuts for Visual Studio 2008</strong>, available for both <a href="http://www.microsoft.com/downloads/details.aspx?FamilyID=e5f902a8-5bb5-4cc6-907e-472809749973&amp;DisplayLang=en">C# </a>and <a href="http://www.microsoft.com/downloads/details.aspx?FamilyID=255b8cf1-f6bd-4b55-bb42-dd1a69315833&amp;DisplayLang=en">Visual Basic</a>.</p>
<p>(Thanks to <a href="http://blogs.msdn.com/cbowen/archive/2007/12/09/got-tech-posters.aspx">Chris Bowen</a> for the tip off.)</p>
]]></content:encoded>
			<wfw:commentRss>http://chrisfulstow.com/net-framework-35-reference-poster/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>SQL Server 2008 will have IntelliSense</title>
		<link>http://chrisfulstow.com/sql-server-2008-will-have-intellisense/</link>
		<comments>http://chrisfulstow.com/sql-server-2008-will-have-intellisense/#comments</comments>
		<pubDate>Fri, 30 Nov 2007 02:59:36 +0000</pubDate>
		<dc:creator>Chris Fulstow</dc:creator>
				<category><![CDATA[.net]]></category>
		<category><![CDATA[asp.net]]></category>
		<category><![CDATA[sql server]]></category>
		<category><![CDATA[sql server 2008]]></category>

		<guid isPermaLink="false">http://3poundmass.wordpress.com/2007/11/30/sql-server-2008-will-have-intellisense/</guid>
		<description><![CDATA[With so many exciting new features in Visual Studio 2008 to explore, I haven&#8217;t had much time to look at the preview releases of SQL Server 2008 (aka Katmai).  The last I heard, there wouldn&#8217;t be that many new goodies for developers, mainly features for DBAs and BI analysts with a few performance optimisations <a href="http://chrisfulstow.com/sql-server-2008-will-have-intellisense/" class="more-link">More &#62;</a>]]></description>
			<content:encoded><![CDATA[<p>With so many exciting <a href="http://weblogs.asp.net/scottgu/archive/2007/11/19/visual-studio-2008-and-net-3-5-released.aspx">new features in Visual Studio 2008</a> to explore, I haven&#8217;t had much time to look at the preview releases of <strong>SQL Server 2008</strong> (aka <em>Katmai</em>).  The last I heard, there wouldn&#8217;t be that many new goodies for developers, mainly features for <strong>DBAs</strong> and <strong>BI analysts</strong> with a few performance optimisations thrown in.</p>
<p>The last upgrade, SQL Server 2000 to 2005, was a huge leap forward for developers and added <strong>significant advances</strong> like CLR integration, SQL Server Management Objects (SMO), Integration Services (SSIS) and a native XML data type; as well as T-SQL enhancements like Common Table Expressions (CTEs), structured error handling with try/catch, pivot, apply, top(n) and row_number.</p>
<p>I was surprised to see how much new stuff is packed into the latest <a href="http://www.microsoft.com/downloads/details.aspx?FamilyId=3BF4C5CA-B905-4EBC-8901-1D4C1D1DA884&amp;displaylang=en">SQL Server 2008 CTP release</a>, even, finally, <strong>IntelliSense for Management Studio</strong>, which was much anticipated but conspicuously absent from SQL 2005:</p>
<p><a title="SQL Server 2008 IntelliSense" href="http://chrisfulstow.com/wp-content/uploads/2007/11/sql2008-intellisense.png"><img src="http://chrisfulstow.com/wp-content/uploads/2007/11/sql2008-intellisense.png" alt="SQL Server 2008 IntelliSense" /></a></p>
<p>Also notice the new <strong>collapsible code regions</strong>, just like you get in Visual Studio.  Editing T-SQL has never been such fun!  Although, you have to feel a bit sorry for RedGate, whose <a href="http://www.red-gate.com/products/sql_prompt/index.htm">SQL Prompt</a> plug-in has been filling the auto-completion gap for the last few years.</p>
]]></content:encoded>
			<wfw:commentRss>http://chrisfulstow.com/sql-server-2008-will-have-intellisense/feed/</wfw:commentRss>
		<slash:comments>14</slash:comments>
		</item>
		<item>
		<title>MCPD Web Developer exam 70-547 hints and tips</title>
		<link>http://chrisfulstow.com/mcpd-web-developer-exam-70-547-hints-and-tips/</link>
		<comments>http://chrisfulstow.com/mcpd-web-developer-exam-70-547-hints-and-tips/#comments</comments>
		<pubDate>Thu, 22 Nov 2007 07:35:30 +0000</pubDate>
		<dc:creator>Chris Fulstow</dc:creator>
				<category><![CDATA[.net]]></category>
		<category><![CDATA[certification]]></category>
		<category><![CDATA[mcpd]]></category>
		<category><![CDATA[mcts]]></category>
		<category><![CDATA[visual studio]]></category>

		<guid isPermaLink="false">http://3poundmass.wordpress.com/2007/11/22/mcpd-web-developer-exam-70-547-hints-and-tips/</guid>
		<description><![CDATA[Further to my notes on studying toward MCPD certification, I&#8217;ve now taken the exam and am pleased to say I passed with a good score.  The exam 70-547 is about designing and developing web applications using ASP.NET 2.0.  It focuses on the full software development lifecycle and covers planning, architecture, design, testing and <a href="http://chrisfulstow.com/mcpd-web-developer-exam-70-547-hints-and-tips/" class="more-link">More &#62;</a>]]></description>
			<content:encoded><![CDATA[<p>Further to my notes on <a href="/exam-70-547-mcpd-web-developer/">studying toward MCPD certification</a>, I&#8217;ve now taken the exam and am pleased to say I passed with a good score.  The exam <a href="http://www.microsoft.com/learning/exams/70-547.mspx">70-547</a> is about designing and developing web applications using ASP.NET 2.0.  It focuses on the full <strong>software development lifecycle</strong> and covers planning, architecture, design, testing and deployment, where as the prerequisite MCTS exams cover more of the actual <strong>coding and implementation</strong> details.</p>
<p>My main study guide was the official Microsoft Press book, <a href="http://www.amazon.com/MCPD-Self-Paced-Training-Exam-70-547/dp/0735623406/">MCPD Self-Paced Training Kit (Exam 70-547)</a>.   It covered the syllabus thoroughly enough to get me through the exam, but like most similar books <strong>wasn&#8217;t much fun to read</strong>.  It&#8217;s over 700 pages, and after the first few hundred the content starts to get fairly monotonous.  It&#8217;s also difficult to skim because you might miss something <strong>essential</strong> for the exam.   If you&#8217;re an experienced developer then you might not learn much, but if you&#8217;re new to coding then you should find plenty of useful information about broader areas of software development, such as <strong>architecture, data modelling and unit testing</strong>.</p>
<p>A lot of the testing chapters read like an advert for <strong>Visual Studio Team System</strong> (VSTS) and aggressively promote its unit testing and web load testing capabilities.  There&#8217;s nothing wrong with that, it&#8217;s a Microsoft exam after all, but you will need <strong>Visual Studio Team Test</strong> if you want to work through the practical exercises (an evaluation version is available).  The unit testing in VSTS is impressive, but doesn&#8217;t seem to offer much over the freely available <a href="http://www.nunit.org/">NUnit</a>.  The web load testing is very good, and a good alternative to JMeter.</p>
<p>My best advice for the book is to read it in <strong>short frequent bursts</strong>.  Try to read a little bit every day and you&#8217;ll easily work through it, so don&#8217;t be intimidated.  If you find yourself slacking, just register for the exam and you&#8217;ll soon become motivated.  And remember to use the <strong>15% exam discount</strong> voucher that comes with the book.</p>
<p>My other study resource, which I also used for the MCTS exams, was the <a href="http://www.measureup.com/catalog/exam.aspx?vid=5&amp;cid=MCPD&amp;tid=13">practice test</a> from <strong>MeasureUp.</strong> The questions are very relevant to the actual exam, and helped highlight areas to focus my study.  The most useful feature is that every answer has an <strong>explanation</strong>, so if you get one wrong you can see why and hopefully fill a gap in your knowledge.</p>
<p>The exam isn&#8217;t easy, but many questions appeal to <strong>common sense</strong> as well as technical expertise, and there aren&#8217;t any trick questions.  There&#8217;s more than enough time to work through the 40 multiple-choice questions, so be careful to read each one closely and <strong>don&#8217;t panic</strong>.  Some questions ask you to pick more than one answer so follow the instructions carefully.  The passing score is 700 out of 1000.</p>
<p>According to Microsoft&#8217;s statistics there are <strong>only 2,147</strong> MCPD web developers <strong>worldwide</strong>, so if you want to improve your skills, stand out in the job market, or negotiate a promotion then certification is a <strong>great career move</strong>.</p>
<p>My next goal is MCTS certification for <strong>SQL Server</strong> and exam <a href="http://www.microsoft.com/learning/exams/70-431.mspx">70–431</a>. Then it shouldn&#8217;t be too long before the next generation of <strong>.NET 3.5</strong> MCTS are available.</p>
]]></content:encoded>
			<wfw:commentRss>http://chrisfulstow.com/mcpd-web-developer-exam-70-547-hints-and-tips/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Finding orphaned stored procedures and user-defined functions in SQL Server</title>
		<link>http://chrisfulstow.com/finding-orphaned-stored-procedures-and-user-defined-functions-in-sql-server/</link>
		<comments>http://chrisfulstow.com/finding-orphaned-stored-procedures-and-user-defined-functions-in-sql-server/#comments</comments>
		<pubDate>Thu, 22 Nov 2007 02:49:14 +0000</pubDate>
		<dc:creator>Chris Fulstow</dc:creator>
				<category><![CDATA[.net]]></category>
		<category><![CDATA[asp.net]]></category>
		<category><![CDATA[c#]]></category>
		<category><![CDATA[sql server]]></category>
		<category><![CDATA[visual studio]]></category>

		<guid isPermaLink="false">http://3poundmass.wordpress.com/2007/11/22/finding-orphaned-stored-procedures-and-user-defined-functions-in-sql-server/</guid>
		<description><![CDATA[I&#8217;m currently working on a group of ASP.NET 2.0 websites deployed across about thirty countries.  The local flagship site runs on an upgraded version of the original code, and I&#8217;m now in the process of bringing all the other sites onto the new improved version.
Over time, new features have been introduced to the site, <a href="http://chrisfulstow.com/finding-orphaned-stored-procedures-and-user-defined-functions-in-sql-server/" class="more-link">More &#62;</a>]]></description>
			<content:encoded><![CDATA[<p>I&#8217;m currently working on a group of <strong>ASP.NET 2.0 websites</strong> deployed across about <strong>thirty countries</strong>.  The local flagship site runs on an upgraded version of the original code, and I&#8217;m now in the process of bringing all the other sites onto the new improved version.</p>
<p>Over time, new features have been introduced to the site, and old ones removed.  Consequently the <strong>SQL Server database</strong> now contains many <strong>redundant tables</strong> that aren&#8217;t used.  So, before cascading out the current schema to the other countries, it&#8217;s time for a clean up.</p>
<p>I managed to identify about 60 tables that aren&#8217;t used by the application and can safely can be dropped or archived.  However, I&#8217;m now left with <strong>hundreds of stored procedures</strong> (SPs) and user-defined functions (UDFs) that were associated with these tables, which can also be removed.</p>
<p>The problem was how to find these <strong>orphaned objects</strong>.  My first approach was a small .NET <strong>console application </strong>which uses <a href="http://technet.microsoft.com/en-us/library/ms162169.aspx">SQL Server Management Objects</a> (SMO).  It loops through all SPs and UDFs and finds any that have <strong>no dependencies</strong>.</p>
<pre class="brush: csharp;">

public List&lt;string&gt; FindOrphans()
{
   Server server = new Server(&quot;.&quot;);
   Database db = server.Databases[&quot;MyDatabase&quot;];
   List&lt;string&gt; orphans = new List&lt;string&gt;();

   // get list of SPs
   UrnCollection urns = new UrnCollection();
   foreach (StoredProcedure sp in db.StoredProcedures)
   {
      // exclude these objects
      if (sp.IsSystemObject) continue;
      if (sp.Name.StartsWith(&quot;aspnet_&quot;)) continue;
      urns.Add(sp.Urn);
   }

   // get dependencies
   DependencyWalker dw = new DependencyWalker(server);
   DependencyTree tree = dw.DiscoverDependencies(urns, true);

   // find all objects without any dependencies
   DependencyTreeNode node = tree.FirstChild;
   do {
      if (!node.HasChildNodes)
      {
         string name = new Urn(node.Urn).GetAttribute(&quot;Name&quot;);
         orphans.Add(name);
      }
      node = node.NextSibling;
   } while (node != null);

   return orphans;
}
</pre>
<p>This works fine, and helped satisfy my current obsession with SMO.  But it&#8217;s a bit awkward, and not easily <strong>portable or modifiable</strong>, to have this pure database operation wrapped up in an executable.  So I looked into doing the same thing with just a <strong>TSQL query</strong>.</p>
<pre class="brush: sql;">
-- Find all SPs and UDFs have no dependencies
select
    object_name(obj.[object_id]) as [orphaned_object_name],
    obj.type_desc as [object_type],
    'DROP ' +
    case obj.type_desc
        when 'SQL_STORED_PROCEDURE' then 'PROCEDURE'
        else 'FUNCTION'
    end
    + ' [' + object_name(obj.[object_id]) + ']'
from
    sys.objects obj
    left join (select distinct [object_id] from sys.sql_dependencies) dep
        on obj.object_id = dep.object_id
where
    type_desc in
        ('SQL_STORED_PROCEDURE','SQL_SCALAR_FUNCTION','SQL_TABLE_VALUED_FUNCTION')
    and object_name(obj.[object_id]) not like 'aspnet_%'
    and dep.object_id is null
order by
    obj.type_desc, object_name(obj.[object_id])
</pre>
<p>The query works by checking for dependencies in the <strong>catalog view</strong> <a href="http://msdn2.microsoft.com/en-us/library/ms174402.aspx">sys.sql_dependencies</a>.  This, I think, is a neater solution.  I also included an <strong>auto-generated column</strong> that writes the SQL drop the SP or UDF, which I copied and executed.</p>
<p>Now, if only I could find a quick way to check for dependencies between my application&#8217;s <strong>data access layer </strong>and the database&#8230;</p>
<p><a href="http://www.dotnetkicks.com/kick/?url=http%3a%2f%2f3poundmass.wordpress.com%2f2007%2f11%2f22%2ffinding-orphaned-stored-procedures-and-user-defined-functions-in-sql-server%2f"><img src="http://www.dotnetkicks.com/Services/Images/KickItImageGenerator.ashx?url=http%3a%2f%2f3poundmass.wordpress.com%2f2007%2f11%2f22%2ffinding-orphaned-stored-procedures-and-user-defined-functions-in-sql-server%2f" border="0" alt="kick it on DotNetKicks.com" /></a></p>
]]></content:encoded>
			<wfw:commentRss>http://chrisfulstow.com/finding-orphaned-stored-procedures-and-user-defined-functions-in-sql-server/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Reading other people&#039;s .NET code</title>
		<link>http://chrisfulstow.com/reading-other-peoples-net-code/</link>
		<comments>http://chrisfulstow.com/reading-other-peoples-net-code/#comments</comments>
		<pubDate>Mon, 27 Aug 2007 08:38:35 +0000</pubDate>
		<dc:creator>Chris Fulstow</dc:creator>
				<category><![CDATA[.net]]></category>
		<category><![CDATA[asp.net]]></category>
		<category><![CDATA[c#]]></category>
		<category><![CDATA[codeplex]]></category>
		<category><![CDATA[programming]]></category>
		<category><![CDATA[vb.net]]></category>

		<guid isPermaLink="false">http://3poundmass.wordpress.com/2007/08/27/reading-other-peoples-net-code/</guid>
		<description><![CDATA[One thing that makes HTML easy to learn is the abundance of examples. You can go to any old website and view the source to see how it&#8217;s put together, or look through templates on a site like Open Source Web Design or Open Source Templates. It&#8217;s easy find examples of good (and bad) practice.
Scott Hanselman&#8217;s <a href="http://chrisfulstow.com/reading-other-peoples-net-code/" class="more-link">More &#62;</a>]]></description>
			<content:encoded><![CDATA[<p>One thing that makes HTML easy to learn is the abundance of examples. You can go to any old website and view the source to see how it&#8217;s put together, or look through templates on a site like <a href="http://www.oswd.org/">Open Source Web Design</a> or <a href="http://opensourcetemplates.org/">Open Source Templates</a>. It&#8217;s easy find examples of good (and bad) practice.</p>
<p>Scott Hanselman&#8217;s article <a href="http://www.hanselman.com/blog/ReadingToBeABetterDeveloperTheCoding4FunDevKit.aspx">Reading to Be a Better Developer</a> got me wondering why we don&#8217;t do this more with <strong>.NET code</strong>, and the problem for me seems to be finding good code examples. Scott recommends looking at the <a href="http://www.codeplex.com/C4FDevKit">Coding4Fun Developer Kit</a>, but I wanted something more specific to web development.</p>
<p>So here are a few places I found ASP.NET source code that&#8217;s worth studying and learning from.</p>
<p><strong>Microsoft Enterprise Library</strong></p>
<p>A great place to start is the <a href="http://msdn2.microsoft.com/en-us/practices/bb190359.aspx">application blocks</a> in Microsoft&#8217;s <a href="http://www.microsoft.com/downloads/details.aspx?familyid=4c557c63-708f-4280-8f0c-637481c31718&amp;displaylang=en">Enterprise Library</a>. These are application service components designed to follow Microsoft best practices and include modules for caching, cryptography, data access, exception handling, logging, policy injection, security and validation.</p>
<p><strong>Website Starter Kits</strong></p>
<p>Another good place to look is the <a href="http://www.asp.net/downloads/starter-kits/">ASP.NET Starter Kit Websites</a>, a collection of working ASP.NET demos that can be examined or built on. They cover DotNetNuke, e-commerce with PayPal, blogging, project time management, media library and plenty more.</p>
<p><strong>Codeplex</strong></p>
<p>Lastly <a href="http://www.codeplex.com/">Codeplex</a>, Microsoft&#8217;s open source project hosting site. There&#8217;s so much goodness here it&#8217;s hard know where to start, so try browsing the most popular or active projects to start. Here are the top ten that caught my eye:</p>
<ul>
<li><span><a href="http://www.codeplex.com/blogengine">BlogEngine.NET</a><br />
Full featured blog engine targeted at .NET developers. It is light weight and very simple to modify and extend.</span></li>
<li><a href="http://www.codeplex.com/umbraco">Umbraco</a><br />
Simple, flexible and friendly ASP.NET CMS</li>
<li><a href="http://www.codeplex.com/DinnerNow">DinnerNow</a><br />
Sample marketplace application designed to demonstrate how you can develop a connected application using IIS7, ASP.NET Ajax Extensions, Linq, WCF, WF, WPF, Powershell, and the .NET Compact Framework.</li>
<li><a href="http://www.codeplex.com/CKS">Community Kit for SharePoint</a><br />
<span>Set of best practices, templates, Web Parts, tools, and source code for creating a community website based on SharePoint.<br />
</span></li>
<li><span><a href="http://www.codeplex.com/FacebookToolkit">Facebook Developer Toolkit</a> and <a href="http://www.codeplex.com/FacebookNET">Facebook.NET</a><br />
.NET wrappers and libraries for the Facebook API.</span></li>
<li><span><a href="http://www.codeplex.com/DbEntry">DbEntry.Net</a><br />
Lightweight, high performance Object Relational Mapping (ORM) database access compnent for .NET 2.0.</span></li>
<li><span><a href="http://www.codeplex.com/publicdomain">PublicDomain</a><br />
</span><span>.NET</span><span> packages for time zone support, logging, dynamic code evaluation, GAC API, unzipping, RSS, Atom, OPML, screen scraping, and utilities for strings, arrays and cryptography.</span></li>
<li><span><a href="http://www.codeplex.com/ASPNETRSSToolkit">ASP.NET RSS Toolkit</a><br />
Gives ASP.NET applications the ability to consume and publish to RSS feeds.</span></li>
<li><a href="http://www.codeplex.com/NGenerics">NGenerics</a><br />
Class library providing generic data structures and algorithms not implemented in the standard .NET framework</li>
<li><a href="http://www.codeplex.com/htmlagilitypack">Html Agility Pack</a><br />
Agile HTML parser that builds a read/write DOM and supports plain XPath or XSLT. The parser is very tolerant with &#8220;real world&#8221; malformed HTML. The object model is very similar to System.Xml, but for HTML documents.</li>
</ul>
<p>If you know any other places to find good quality .NET source code then please leave a comment.</p>
]]></content:encoded>
			<wfw:commentRss>http://chrisfulstow.com/reading-other-peoples-net-code/feed/</wfw:commentRss>
		<slash:comments>10</slash:comments>
		</item>
		<item>
		<title>Task List comments in Visual Studio</title>
		<link>http://chrisfulstow.com/task-list-comments-in-visual-studio/</link>
		<comments>http://chrisfulstow.com/task-list-comments-in-visual-studio/#comments</comments>
		<pubDate>Thu, 23 Aug 2007 02:46:18 +0000</pubDate>
		<dc:creator>Chris Fulstow</dc:creator>
				<category><![CDATA[.net]]></category>
		<category><![CDATA[c#]]></category>
		<category><![CDATA[programming]]></category>
		<category><![CDATA[vb.net]]></category>
		<category><![CDATA[visual studio]]></category>

		<guid isPermaLink="false">http://3poundmass.wordpress.com/2007/08/23/task-list-comments-in-visual-studio/</guid>
		<description><![CDATA[Here&#8217;s a quick Visual Studio tip.  You can embed useful notes and reminders in code using Task List comments like this:
// TODO: fix catastrophic memory leak
These notes will automatically appear in the Visual Studio Task List, which you can open with the shortcut Ctrl+W, T or by selecting View &#8211; Task List from the <a href="http://chrisfulstow.com/task-list-comments-in-visual-studio/" class="more-link">More &#62;</a>]]></description>
			<content:encoded><![CDATA[<p>Here&#8217;s a quick <strong>Visual Studio</strong> tip.  You can embed useful notes and reminders in code using <a href="http://msdn2.microsoft.com/en-US/library/zce12xx2(VS.80).aspx">Task List comments</a> like this:</p>
<pre style="margin:0;"><span style="color:green;">// TODO: fix catastrophic memory leak</span></pre>
<p>These notes will automatically appear in the Visual Studio <a href="http://msdn2.microsoft.com/en-us/library/170k1bbs(VS.80).aspx">Task List</a>, which you can open with the shortcut <strong>Ctrl+W, T</strong> or by selecting <strong>View &#8211; Task List</strong> from the main menu bar.</p>
<p><img src="http://3poundmass.files.wordpress.com/2007/08/vs-task-list.png" alt="Visual Studio Task List" /></p>
<p>Visual Studio also supports two other comment tokens, HACK and UNDONE.  You can even <a href="http://msdn2.microsoft.com/en-US/library/ekwz6akh(VS.80).aspx">add your own custom comment tokens</a> in:</p>
<p><strong>Options &#8211; Environment &#8211; Task List</strong>.</p>
]]></content:encoded>
			<wfw:commentRss>http://chrisfulstow.com/task-list-comments-in-visual-studio/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
	</channel>
</rss>
