<?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/"
	>

<channel>
	<title>NetInverse Developers Blog</title>
	<atom:link href="http://netinverse.com/devblogs/?feed=rss2" rel="self" type="application/rss+xml" />
	<link>http://netinverse.com/devblogs</link>
	<description>All rights reserved.</description>
	<pubDate>Tue, 09 Feb 2010 06:40:05 +0000</pubDate>
	<generator>http://wordpress.org/?v=2.7.1</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>LINQ Expression Sample: Static Reflection</title>
		<link>http://netinverse.com/devblogs/dotnet/linq-expression-sample-static-reflection/868/</link>
		<comments>http://netinverse.com/devblogs/dotnet/linq-expression-sample-static-reflection/868/#comments</comments>
		<pubDate>Tue, 09 Feb 2010 06:32:45 +0000</pubDate>
		<dc:creator>admin</dc:creator>
		
		<category><![CDATA[.Net]]></category>

		<category><![CDATA[Expression]]></category>

		<category><![CDATA[LINQ]]></category>

		<guid isPermaLink="false">http://netinverse.com/devblogs/?p=868</guid>
		<description><![CDATA[Dynamic reflection is the classic .Net reflection. Now there is a new pattern called &#8220;Static Reflection&#8221; which is very popular in some open source code like nHibernate. Static Reflection&#8217;s main
benefit is &#8220;refactoring&#8221; friendly. For example, in the following code snippet, if you use the static relfection and change the property name, it won&#8217;t break. If [...]]]></description>
			<content:encoded><![CDATA[<p>Dynamic reflection is the classic .Net reflection. Now there is a new pattern called &#8220;<strong>Static Reflection</strong>&#8221; which is very popular in some open source code like nHibernate. Static Reflection&#8217;s main<br />
benefit is &#8220;refactoring&#8221; friendly. For example, in the following code snippet, if you use the static relfection and change the property name, it won&#8217;t break. If you use the string to locate the property, it will break easily. </p>
<pre>
    //Classic Reflection
    var entity = new SampleEntity();
    entity.SetValue(entity, "Id", 100); //dynamic binding
    entity.SetValue(entity, "Name", "Sample");

    //Static Relection
    var entity1 = new SampleEntity();
    entity1.SetValue(e => e.Id, 100); //early binding
    entity1.SetValue(e => e.Name, "Sample");
</pre>
<pre>
// Static reflections.cs - the following code was contributed by Jessica L.
using System;
using System.Linq.Expressions;
using System.Reflection;

namespace LinqExpressionSample
{
    public class SampleEntity
    {
        public int Id { get; set; }
        public string Name { get; set; }

        public void SetValue<T>(T entity, string propertyName, object value)
        {
            PropertyInfo propertyInfo = typeof (T).GetProperty(propertyName);
            propertyInfo.SetValue(entity, value, null);
        }

    }

    public static class Extension
    {
        public static void SetValue<T>(this T entity, Expression<Func<T, object>> expression, object value)
        {
            MemberExpression memberExpression = GetMemberExpression(expression);
            var propertyInfo = memberExpression.Member as PropertyInfo;
            propertyInfo.SetValue(entity, value, null);
        }

        private static MemberExpression GetMemberExpression<T, TValue>(Expression<Func<T, TValue>> expression)
        {
            if (expression == null)
            {
                return null;
            }
            if (expression.Body is MemberExpression)
            {
                return (MemberExpression)expression.Body;
            }
            if (expression.Body is UnaryExpression)
            {
                var operand = ((UnaryExpression)expression.Body).Operand;
                if (operand is MemberExpression)
                {
                    return (MemberExpression)operand;
                }
                if (operand is MethodCallExpression)
                {
                    return ((MethodCallExpression)operand).Object as MemberExpression;
                }
            }
            return null;
        }
    }
}
</pre>
]]></content:encoded>
			<wfw:commentRss>http://netinverse.com/devblogs/dotnet/linq-expression-sample-static-reflection/868/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Use DataContract Attribute for Fast Object Xml Serialization/Deserialization</title>
		<link>http://netinverse.com/devblogs/dotnet/use-datacontract-attribute-for-fast-object-xml-serializationdeserialization/859/</link>
		<comments>http://netinverse.com/devblogs/dotnet/use-datacontract-attribute-for-fast-object-xml-serializationdeserialization/859/#comments</comments>
		<pubDate>Wed, 06 Jan 2010 05:59:23 +0000</pubDate>
		<dc:creator>admin</dc:creator>
		
		<category><![CDATA[.Net]]></category>

		<category><![CDATA[Add new tag]]></category>

		<category><![CDATA[C#]]></category>

		<category><![CDATA[Serialization]]></category>

		<category><![CDATA[WCF]]></category>

		<category><![CDATA[Xml]]></category>

		<guid isPermaLink="false">http://netinverse.com/devblogs/?p=859</guid>
		<description><![CDATA[If you use WCF to create web services, you need to define your data contracts by using DataContract/DataMember attributes.
Actually you can use them directly for serialization/deserialization in your code. Following is a sample of how to use DataContract/DataMember attributes for fast object Xml serialization and deserialization. 

using System.IO;
using System.Runtime.Serialization;
using System.Text;
using System.Xml;

namespace DataContractSerialization
{
    [...]]]></description>
			<content:encoded><![CDATA[<p>If you use WCF to create web services, you need to define your data contracts by using DataContract/DataMember attributes.<br />
Actually you can use them directly for serialization/deserialization in your code. Following is a sample of how to use DataContract/DataMember attributes for fast object Xml serialization and deserialization. </p>
<pre name="code" class="c-sharp">
using System.IO;
using System.Runtime.Serialization;
using System.Text;
using System.Xml;

namespace DataContractSerialization
{
    class Program
    {
        static void Main(string[] args)
        {
            Student student = new Student()
            {
                Age = 12,
                Name = "David"
            };

            DataContractSerializer dcs = new DataContractSerializer(typeof(Student));
            StringBuilder sb = new StringBuilder();

            using(XmlWriter writer = XmlWriter.Create(sb))
            {
                dcs.WriteObject(writer, student);
            }
            string xml = sb.ToString();

            using (XmlTextReader reader = new XmlTextReader(new StringReader(xml)))
            {
                Student newStudent = (Student) dcs.ReadObject(reader, true);
            }
        }
    }

    [DataContract(Namespace="http://www.netinverse.com")]
    public class Student
    {
        [DataMember]
        public string Name { get; set; }

        [DataMember]
        public int Age { get; set; }
    }
}
</pre>
]]></content:encoded>
			<wfw:commentRss>http://netinverse.com/devblogs/dotnet/use-datacontract-attribute-for-fast-object-xml-serializationdeserialization/859/feed/</wfw:commentRss>
		</item>
		<item>
		<title>MSI Installer Tips and Tricks - Force Install</title>
		<link>http://netinverse.com/devblogs/wix/msi-installer-tips-and-tricks/847/</link>
		<comments>http://netinverse.com/devblogs/wix/msi-installer-tips-and-tricks/847/#comments</comments>
		<pubDate>Wed, 06 Jan 2010 04:33:37 +0000</pubDate>
		<dc:creator>admin</dc:creator>
		
		<category><![CDATA[WiX]]></category>

		<category><![CDATA[Installer]]></category>

		<category><![CDATA[MSI]]></category>

		<category><![CDATA[Setup]]></category>

		<guid isPermaLink="false">http://netinverse.com/devblogs/?p=847</guid>
		<description><![CDATA[If you have worked with MSI for a while, I bet you have encountered this: You have built and installed an MSI. Later on you change the WiX of it and build the new MSI, when you try to uninstall the old MSI with the new one, the uninstall fails.
In this case, you can
1) Use [...]]]></description>
			<content:encoded><![CDATA[<p>If you have worked with MSI for a while, I bet you have encountered this: You have built and installed an MSI. Later on you change the WiX of it and build the new MSI, when you try to uninstall the old MSI with the new one, the uninstall fails.</p>
<p>In this case, you can</p>
<p>1) Use the utility tool MSIZap to clean up manually.<br />
2) Or, do a force install with the new MSI using msiexec&#8217;s <strong>Repair Options</strong>. After that you can uninstall the MSI and go back to the good state.</p>
<p><code>msiexec /i  /fe your_installer.msi</code></p>
<p>Repair Options<br />
/f[p|e|c|m|s|o|d|a|u|v]<br />
Repairs a product<br />
p - only if file is missing<br />
o - if file is missing or an older version is installed (default)<br />
e - if file is missing or an equal or older version is installed<br />
d - if file is missing or a different version is installed<br />
c - if file is missing or checksum does not match the calculated value<br />
a - forces all files to be reinstalled<br />
u - all required user-specific registry entries (default)<br />
m - all required computer-specific registry entries (default)<br />
s - all existing shortcuts (default)<br />
v - runs from source and recaches local package</p>
]]></content:encoded>
			<wfw:commentRss>http://netinverse.com/devblogs/wix/msi-installer-tips-and-tricks/847/feed/</wfw:commentRss>
		</item>
		<item>
		<title>How to Use WiX include</title>
		<link>http://netinverse.com/devblogs/wix/how-to-use-wix-include/836/</link>
		<comments>http://netinverse.com/devblogs/wix/how-to-use-wix-include/836/#comments</comments>
		<pubDate>Tue, 08 Dec 2009 09:38:11 +0000</pubDate>
		<dc:creator>admin</dc:creator>
		
		<category><![CDATA[WiX]]></category>

		<category><![CDATA[Include]]></category>

		<category><![CDATA[WXI]]></category>

		<guid isPermaLink="false">http://netinverse.com/devblogs/?p=836</guid>
		<description><![CDATA[A sample master WiX file has includes: 

&#60;Directory Id="BIN" Name="bin"&#62;
    &#60;?include ..\include\shared.wxi?&#62;
        &#60;Component Id="Service.SharedFiles" DiskId="1" Guid="72e3b959-9515-40ba-a095-bf788aa3d617"&#62;
            &#60;CreateFolder&#62;
                &#60;Permission User="Administrators" [...]]]></description>
			<content:encoded><![CDATA[<p><H2>A sample master WiX file has includes: </H2></p>
<pre>
&lt;Directory Id="BIN" Name="bin"&gt;
    &lt;?include ..\include\shared.wxi?&gt;
        &lt;Component Id="Service.SharedFiles" DiskId="1" Guid="72e3b959-9515-40ba-a095-bf788aa3d617"&gt;
            &lt;CreateFolder&gt;
                &lt;Permission User="Administrators" GenericAll="yes" /&gt;
</pre>
<p><H2>A sample shared.wxi to be included: </H2></p>
<pre>
&lt;?xml version="1.0"?&gt;
&lt;Include&gt;
    &lt;Component Id="Component_1" Guid="58345065-0314-41fd-9992-d960f297ba9a" DiskId="1"&gt;
        &lt;File Id="File1" Name="Net_~1.dll" LongName="NetInverse.core.dll"
            KeyPath="yes" Compressed="yes" src="$(var.COREDIR)\bin\" /&gt;
 </pre>
]]></content:encoded>
			<wfw:commentRss>http://netinverse.com/devblogs/wix/how-to-use-wix-include/836/feed/</wfw:commentRss>
		</item>
		<item>
		<title>How to Debug Managed Memory Leak</title>
		<link>http://netinverse.com/devblogs/debugging/how-to-debug-managed-memory-leak/829/</link>
		<comments>http://netinverse.com/devblogs/debugging/how-to-debug-managed-memory-leak/829/#comments</comments>
		<pubDate>Sun, 15 Nov 2009 07:59:52 +0000</pubDate>
		<dc:creator>admin</dc:creator>
		
		<category><![CDATA[Debugging]]></category>

		<category><![CDATA[.Net]]></category>

		<category><![CDATA[CLR]]></category>

		<category><![CDATA[SOS]]></category>

		<guid isPermaLink="false">http://netinverse.com/devblogs/?p=829</guid>
		<description><![CDATA[Managed Memory Leak will be reported by an OutOfMemoryException exception thrown by the CLR. There are a few reasons will result in it.
1) Too many objects are alive.
2) Object handle leak. Use !sos.objsize to list handles.
3) Heap fragmentation. Use !sos.dumpheap to get excessive GC Heap fragmentation report.
]]></description>
			<content:encoded><![CDATA[<p>Managed Memory Leak will be reported by an OutOfMemoryException exception thrown by the CLR. There are a few reasons will result in it.</p>
<p>1) Too many objects are alive.<br />
2) Object handle leak. Use <strong>!sos.objsize</strong> to list handles.<br />
3) Heap fragmentation. Use <strong>!sos.dumpheap</strong> to get excessive GC Heap fragmentation report.</p>
]]></content:encoded>
			<wfw:commentRss>http://netinverse.com/devblogs/debugging/how-to-debug-managed-memory-leak/829/feed/</wfw:commentRss>
		</item>
		<item>
		<title>What is GCSTRESS?</title>
		<link>http://netinverse.com/devblogs/dotnet/what-is-gcstress/824/</link>
		<comments>http://netinverse.com/devblogs/dotnet/what-is-gcstress/824/#comments</comments>
		<pubDate>Sun, 15 Nov 2009 07:42:23 +0000</pubDate>
		<dc:creator>admin</dc:creator>
		
		<category><![CDATA[.Net]]></category>

		<category><![CDATA[CLR]]></category>

		<category><![CDATA[Debugging]]></category>

		<category><![CDATA[SOS]]></category>

		<guid isPermaLink="false">http://netinverse.com/devblogs/?p=824</guid>
		<description><![CDATA[There are two types of heap corruptions: 1) NT Heap Corruption 2) GC Heap Corruption.
GCSTRESS is a checked or debugging build with some registry keys set used to debug the GC Heap Corruption. It forces the garbage collection to occur very oftern to shake out a bug. 
]]></description>
			<content:encoded><![CDATA[<p>There are two types of heap corruptions: 1) NT Heap Corruption 2) GC Heap Corruption.</p>
<p>GCSTRESS is a checked or debugging build with some registry keys set used to debug the GC Heap Corruption. It forces the garbage collection to occur very oftern to <em>shake out</em> a bug. </p>
]]></content:encoded>
			<wfw:commentRss>http://netinverse.com/devblogs/dotnet/what-is-gcstress/824/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Software Product Lines</title>
		<link>http://netinverse.com/devblogs/software-product-lines/805/805/</link>
		<comments>http://netinverse.com/devblogs/software-product-lines/805/805/#comments</comments>
		<pubDate>Tue, 03 Nov 2009 07:19:58 +0000</pubDate>
		<dc:creator>admin</dc:creator>
		
		<category><![CDATA[Software Product Lines]]></category>

		<category><![CDATA[Software Product Line]]></category>

		<guid isPermaLink="false">http://netinverse.com/devblogs/?p=805</guid>
		<description><![CDATA[Software product lines, or software product line development, refers to software engineering methods, tools and techniques for creating a collection of similar software systems from a shared set of software assets using a common means of production. 
Software Product Lines Carnegie Mellon Software Engineering Institute Web Site
Software Products Lines Community Web Site and Discussion Forums
]]></description>
			<content:encoded><![CDATA[<div id="attachment_804" class="wp-caption aligncenter" style="width: 969px"><a href="http://netinverse.com/devblogs/wp-content/uploads/2009/11/software-product-lines.jpg"><img class="size-full wp-image-804" title="software-product-lines" src="http://netinverse.com/devblogs/wp-content/uploads/2009/11/software-product-lines.jpg" alt="Software product lines" width="959" height="687" /></a><p class="wp-caption-text">Software product lines</p></div>
<p>Software product lines, or software product line development, refers to software engineering methods, tools and techniques for creating a collection of similar software systems from a shared set of software assets using a common means of production. </p>
<li><a class="external text" rel="nofollow" href="http://www.sei.cmu.edu/productlines">Software Product Lines</a> Carnegie Mellon <a title="Software Engineering Institute" href="http://en.wikipedia.org/wiki/Software_Engineering_Institute">Software Engineering Institute</a> Web Site</li>
<li><a class="external text" rel="nofollow" href="http://www.softwareproductlines.com">Software Products Lines</a> Community Web Site and Discussion Forums</li>
]]></content:encoded>
			<wfw:commentRss>http://netinverse.com/devblogs/software-product-lines/805/805/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Net Objectives delivers Public Courses</title>
		<link>http://netinverse.com/devblogs/agile/net-objectives-delivers-public-courses/761/</link>
		<comments>http://netinverse.com/devblogs/agile/net-objectives-delivers-public-courses/761/#comments</comments>
		<pubDate>Tue, 21 Jul 2009 07:06:35 +0000</pubDate>
		<dc:creator>admin</dc:creator>
		
		<category><![CDATA[Agile]]></category>

		<category><![CDATA[scrum]]></category>

		<category><![CDATA[XP]]></category>

		<guid isPermaLink="false">http://netinverse.com/devblogs/?p=761</guid>
		<description><![CDATA[Net Objectives delivers Public Courses in all best practices of effective software development. Delivered in convenient, central locations, our courses are designed to help you and your team maximize the business value returned from your engineering efforts in software development and maintenance.
Net Objectives Public Courses are delivered throughout the country. Use the below schedule to [...]]]></description>
			<content:encoded><![CDATA[<p>Net Objectives delivers Public Courses in all best practices of effective software development. Delivered in convenient, central locations, our courses are designed to help you and your team maximize the business value returned from your engineering efforts in software development and maintenance.</p>
<p>Net Objectives Public Courses are delivered throughout the country. Use the below schedule to sort Courses by Course Name, Date, City or State.</p>
<p><a href="http://www.netobjectives.com/courses/">http://www.netobjectives.com/courses/</a></p>
]]></content:encoded>
			<wfw:commentRss>http://netinverse.com/devblogs/agile/net-objectives-delivers-public-courses/761/feed/</wfw:commentRss>
		</item>
		<item>
		<title>SQL Tips and Tricks</title>
		<link>http://netinverse.com/devblogs/sql/sql-tips-tricks/734/</link>
		<comments>http://netinverse.com/devblogs/sql/sql-tips-tricks/734/#comments</comments>
		<pubDate>Thu, 09 Jul 2009 06:25:50 +0000</pubDate>
		<dc:creator>admin</dc:creator>
		
		<category><![CDATA[SQL]]></category>

		<guid isPermaLink="false">http://netinverse.com/devblogs/?p=734</guid>
		<description><![CDATA[Useful SQL Queries
Showing the plan hash values:
SELECT s.execution_count
      ,s.query_hash
      ,s.query_plan_hash
      ,t.text
FROM   sys.dm_exec_query_stats s
       CROSS APPLY sys.dm_exec_sql_text(s.plan_handle) t
Showing execution plans in the procedure cache:
SELECT * FROM sys.dm_exec_cached_plans
Showing fragmentation:
SELECT  s.avg_fragmentation_in_percent
    [...]]]></description>
			<content:encoded><![CDATA[<h2>Useful SQL Queries</h2>
<p>Showing the plan hash values:</p>
<pre>SELECT s.execution_count
      ,s.query_hash
      ,s.query_plan_hash
      ,t.text
FROM   sys.dm_exec_query_stats s
       CROSS APPLY sys.dm_exec_sql_text(s.plan_handle) t</pre>
<p>Showing execution plans in the procedure cache:</p>
<pre>SELECT * FROM sys.dm_exec_cached_plans</pre>
<p>Showing fragmentation:</p>
<pre>SELECT  s.avg_fragmentation_in_percent
       ,s.fragment_count
       ,s.page_count
       ,s.avg_page_space_used_in_percent
       ,s.record_count
       ,avg_record_size_in_bytes
FROM    sys.dm_db_index_physical_stats(DB_ID('AdventureWorks2008'),
                                       OBJECT_ID(N'dbo.t1'), NULL, NULL,
                                       'Sampled') AS s
</pre>
<p>Show SQL memory usages:</p>
<p>CACHESTORE_OBJCP: These are compiled plans for stored procedures, functions and triggers.<br />
CACHESTORE_SQLCP: These are cached SQL statements or batches that aren&#8217;t in stored procedures, functions and triggers.  This includes any dynamic SQL or raw SELECT statements sent to the server.</p>
<pre>
SELECT * FROM sys.dm_exec_cached_plans

SELECT * FROM sys.dm_os_memory_cache_clock_hands
WHERE TYPE IN ('CACHESTORE_SQLCP','CACHESTORE_OBJCP')
ORDER BY removed_all_rounds_count desc 

SELECT TOP 512
	st.text,
	cp.cacheobjtype,
	cp.objtype,
	cp.refcounts,
	cp.usecounts,
	cp.size_in_bytes,
	cp.bucketid,
	cp.plan_handle
FROM sys.dm_exec_cached_plans as cp
CROSS APPLY sys.dm_exec_sql_text(cp.plan_handle) as st
WHERE cp.cacheobjtype = 'Compiled Plan' AND cp.objtype = 'Prepared'
ORDER BY cp.usecounts desc

SELECT  TOP 10
	LEFT([name], 20) as [name],
	LEFT([type], 20) as [type],
	[single_pages_kb] + [multi_pages_kb] AS cache_kb,
	[entries_count]
FROM sys.dm_os_memory_cache_counters
ORDER BY single_pages_kb + multi_pages_kb DESC

SELECT TOP 10 type,
	(sum(single_pages_kb) + sum(multi_pages_kb)) as 'Total Pages(KB)',
	sum(single_pages_kb) as 'Single Pages(KB)',
	sum(multi_pages_kb) as 'Multi Pages(KB)',
	sum(virtual_memory_reserved_kb) as 'VM Reserved(KB)',
	sum(virtual_memory_committed_kb) as 'VM Committed(KB)',
	sum(awe_allocated_kb) as 'AWE Allocated(KB)',
	sum(shared_memory_reserved_kb) as 'Shared Memory Reserved(KB)',
	sum(shared_memory_committed_kb) as 'Shared Memory Committed(KB)'
FROM sys.dm_os_memory_clerks
GROUP BY type
ORDER BY sum(single_pages_kb) + sum(multi_pages_kb) desc
</pre>
<h2>SQL Performance Tips</h2>
<p>Top SQL Server 2005 Performance Issues for OLTP Applications: <a href="http://www.microsoft.com/technet/prodtechnol/sql/bestpractice/oltp-performance-issues.mspx" target="_blank">http://www.microsoft.com/technet/prodtechnol/sql/bestpractice/oltp-performance-issues.mspx </a><br />
Troubleshooting Performance Problems in SQL Server 2005: <a href="http://technet.microsoft.com/en-us/library/cc966540.aspx" target="_blank">http://technet.microsoft.com/en-us/library/cc966540.aspx</a><br />
Batch Compilation, Recompilation, and Plan Caching Issues in SQL Server 2005: <a href="http://www.microsoft.com/technet/prodtechnol/sql/2005/recomp.mspx" target="_blank">http://www.microsoft.com/technet/prodtechnol/sql/2005/recomp.mspx</a></p>
]]></content:encoded>
			<wfw:commentRss>http://netinverse.com/devblogs/sql/sql-tips-tricks/734/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Pragmatic Unit Testing in C# with NUnit</title>
		<link>http://netinverse.com/devblogs/dotnet/pragmatic-unit-testing-in-csharp-with-nunit/724/</link>
		<comments>http://netinverse.com/devblogs/dotnet/pragmatic-unit-testing-in-csharp-with-nunit/724/#comments</comments>
		<pubDate>Sat, 20 Jun 2009 08:11:01 +0000</pubDate>
		<dc:creator>admin</dc:creator>
		
		<category><![CDATA[.Net]]></category>

		<category><![CDATA[Agile]]></category>

		<category><![CDATA[C#]]></category>

		<category><![CDATA[TDD]]></category>

		<guid isPermaLink="false">http://netinverse.com/devblogs/?p=724</guid>
		<description><![CDATA[Pragmatic programmers use feedback to drive their development and personal processes. The most valuable feedback you can get while coding comes from unit testing. Now in it’s second edition, Pragmatic Unit Testing in C# with NUnit, 2nd Ed. will show you how to do software unit testing, of course, but more importantly will show you [...]]]></description>
			<content:encoded><![CDATA[<p>Pragmatic programmers use feedback to drive their development and personal processes. The most valuable feedback you can get while coding comes from unit testing. Now in it’s second edition, Pragmatic Unit Testing in C# with NUnit, 2nd Ed. will show you how to do software unit testing, of course, but more importantly will show you what to test.</p>
<h2>About this book</h2>
<p>New for the Second Edition:</p>
<ul>
<li>Updated for NUnit 2.4 (C#, .NET 2.0, Visual Studio 2005, and Mono)</li>
<li>More NUnit assert methods</li>
<li>New String and Collection assertion support</li>
<li>Better support for multiple-platform development (Mono and .NET)</li>
<li>Higher-level setup and teardown fixtures</li>
<li>&#8230;and more!</li>
</ul>
<p>Without good tests in place, coding can become a frustrating game of “whack-a-mole.” That’s the carnival game where the player strikes at a mechanical mole; it retreats and another mole pops up on the opposite side of the field. The moles pop up and down so fast that you end up flailing your mallet helplessly as the moles continue to pop up where you least expect them. You need automated testing and regression testing to keep the moles from popping up.</p>
<p>You don’t test a bridge by driving a single car over it right down the middle lane on a clear, calm day. Yet many programmers approach testing that same way—one pass right down the middle and they call it “tested.” Pragmatic programmers can do better than that!</p>
<p><a title="Pragmatic Unit Testing in C# with NUnit" href="http://www.pragprog.com/titles/utc2/pragmatic-unit-testing-in-c-with-nunit" target="_blank">With this book</a>, you will:</p>
<ul>
<li>Write better code, faster</li>
<li>Discover the best hiding places where C# bugs breed</li>
<li>Learn how to think of all the things that could go wrong</li>
<li>Test pieces of code without using the whole .NET project</li>
<li>Use NUnit to simplify your C# test code</li>
<li>Test effectively with the whole team</li>
</ul>
<p>Real software unit testing will make your life easier. It will make your software design and architecture better and drastically reduce the amount of time you spend debugging you .NET code.</p>
]]></content:encoded>
			<wfw:commentRss>http://netinverse.com/devblogs/dotnet/pragmatic-unit-testing-in-csharp-with-nunit/724/feed/</wfw:commentRss>
		</item>
	</channel>
</rss>
