<?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>blog.ahzf.de &#187; Coding</title>
	<atom:link href="http://blog.ahzf.de/index.php/tag/coding/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.ahzf.de</link>
	<description></description>
	<lastBuildDate>Tue, 22 Dec 2009 18:21:45 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.4</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>C# and implicit conversions</title>
		<link>http://blog.ahzf.de/index.php/2009/10/04/c-and-implicit-conversions/</link>
		<comments>http://blog.ahzf.de/index.php/2009/10/04/c-and-implicit-conversions/#comments</comments>
		<pubDate>Sun, 04 Oct 2009 21:29:31 +0000</pubDate>
		<dc:creator>ahzf</dc:creator>
				<category><![CDATA[Software Development]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[Coding]]></category>

		<guid isPermaLink="false">http://blog.ahzf.de/?p=599</guid>
		<description><![CDATA[Sometime you decide to create a small datastructure &#8211; let&#8217;s call it Trinary   &#8211; which will mostly behave like some standard datastructure &#8211; let&#8217;s think of Boolean &#8211; but with some different behavior from time to time. TO avoid a lot of noisy changes to your codebase it might be better to define [...]]]></description>
			<content:encoded><![CDATA[<p>Sometime you decide to create a small datastructure &#8211; let&#8217;s call it Trinary <img src='http://blog.ahzf.de/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' />  &#8211; which will mostly behave like some standard datastructure &#8211; let&#8217;s think of Boolean &#8211; but with some different behavior from time to time. TO avoid a lot of noisy changes to your codebase it might be better to define an implicit conversation from your new datastructure to the standard datastructure (and vice versa). Fortunately this is very easy within C# as all you have to do is to implement appropriate &#8220;public static implicit operator $DestType($SourceType myParam)&#8221; methods for the conversion:</p>
<div class="dean_ch" style="white-space: wrap;">
<span class="kw1">public</span> <span class="kw1">static</span> <span class="kw1">implicit</span> <span class="kw1">operator</span> Trinary<span class="br0">&#40;</span>Boolean myBoolean<span class="br0">&#41;</span><br />
<span class="br0">&#123;</span><br />
&nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>myBoolean<span class="br0">&#41;</span> <span class="kw1">return</span> Trinary.<span class="kw1">TRUE</span>;<br />
&nbsp; <span class="kw1">return</span> Trinary.<span class="kw1">FALSE</span>;<br />
<span class="br0">&#125;</span></p>
<p><span class="kw1">public</span> <span class="kw1">static</span> <span class="kw1">implicit</span> <span class="kw1">operator</span> Boolean<span class="br0">&#40;</span>Trinary myTrinary<span class="br0">&#41;</span><br />
<span class="br0">&#123;</span><br />
&nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>myTrinary == Trinary.<span class="kw1">FALSE</span><span class="br0">&#41;</span> <span class="kw1">return</span> <span class="kw1">false</span>;<br />
&nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>myTrinary == Trinary.<span class="me1">DELETED</span><span class="br0">&#41;</span> <span class="kw1">return</span> <span class="kw1">false</span>;<br />
&nbsp; <span class="kw1">return</span> <span class="kw1">true</span>;<br />
<span class="br0">&#125;</span><br />
&nbsp;</div>
<p>The complete class might look like the following:</p>
<div class="dean_ch" style="white-space: wrap;">
<span class="kw1">public</span> <span class="kw1">sealed</span> <span class="kw4">class</span> Trinary<br />
<span class="br0">&#123;</span></p>
<p><span class="co2">#region Data</span></p>
<p><span class="kw1">public</span> <span class="kw1">readonly</span> <span class="kw4">String</span> Name;<br />
<span class="kw1">public</span> <span class="kw1">readonly</span> <span class="kw4">Byte</span> Value;</p>
<p><span class="co2">#endregion</span></p>
<p><span class="co2">#region Init default values</span></p>
<p><span class="kw1">public</span> <span class="kw1">static</span> <span class="kw1">readonly</span> Trinary <span class="kw1">FALSE</span>   = <a href="http://www.google.com/search?q=new+msdn.microsoft.com"><span class="kw3">new</span></a> Trinary<span class="br0">&#40;</span><span class="nu0">0</span>, <span class="st0">&quot;FALSE&quot;</span><span class="br0">&#41;</span>;<br />
<span class="kw1">public</span> <span class="kw1">static</span> <span class="kw1">readonly</span> Trinary <span class="kw1">TRUE</span>    = <a href="http://www.google.com/search?q=new+msdn.microsoft.com"><span class="kw3">new</span></a> Trinary<span class="br0">&#40;</span><span class="nu0">1</span>, <span class="st0">&quot;TRUE&quot;</span><span class="br0">&#41;</span>;<br />
<span class="kw1">public</span> <span class="kw1">static</span> <span class="kw1">readonly</span> Trinary DELETED = <a href="http://www.google.com/search?q=new+msdn.microsoft.com"><span class="kw3">new</span></a> Trinary<span class="br0">&#40;</span><span class="nu0">2</span>, <span class="st0">&quot;DELETED&quot;</span><span class="br0">&#41;</span>;</p>
<p><span class="co2">#endregion</span></p>
<p><span class="co2">#region (private) Constructor</span></p>
<p><span class="kw1">private</span> Trinary<span class="br0">&#40;</span><span class="kw4">Byte</span> myValue, <span class="kw4">String</span> myName<span class="br0">&#41;</span><br />
<span class="br0">&#123;</span><br />
<span class="kw1">this</span>.<span class="me1">Name</span>   = myName;<br />
<span class="kw1">this</span>.<span class="me1">Value</span>  = myValue;<br />
<span class="br0">&#125;</span></p>
<p><span class="co2">#endregion</span></p>
<p><span class="co2">#region Implicit conversion to/from Boolean</span></p>
<p><span class="kw1">public</span> <span class="kw1">static</span> <span class="kw1">implicit</span> <span class="kw1">operator</span> Trinary<span class="br0">&#40;</span>Boolean myBoolean<span class="br0">&#41;</span><br />
<span class="br0">&#123;</span></p>
<p><span class="kw1">if</span> <span class="br0">&#40;</span>myBoolean<span class="br0">&#41;</span><br />
<span class="kw1">return</span> Trinary.<span class="kw1">TRUE</span>;</p>
<p><span class="kw1">return</span> Trinary.<span class="kw1">FALSE</span>;</p>
<p><span class="br0">&#125;</span></p>
<p><span class="kw1">public</span> <span class="kw1">static</span> <span class="kw1">implicit</span> <span class="kw1">operator</span> Boolean<span class="br0">&#40;</span>Trinary myTrinary<span class="br0">&#41;</span><br />
<span class="br0">&#123;</span></p>
<p><span class="kw1">if</span> <span class="br0">&#40;</span>myTrinary == Trinary.<span class="kw1">FALSE</span><span class="br0">&#41;</span><br />
<span class="kw1">return</span> <span class="kw1">false</span>;</p>
<p><span class="kw1">if</span> <span class="br0">&#40;</span>myTrinary == Trinary.<span class="me1">DELETED</span><span class="br0">&#41;</span><br />
<span class="kw1">return</span> <span class="kw1">false</span>;</p>
<p><span class="co1">//if (myTrinary == Trinary.TRUE)</span><br />
<span class="kw1">return</span> <span class="kw1">true</span>;</p>
<p><span class="br0">&#125;</span></p>
<p><span class="co2">#endregion</span></p>
<p><span class="kw1">public</span> <span class="kw4">int</span> CompareTo<span class="br0">&#40;</span>Boolean myBoolean<span class="br0">&#41;</span><br />
<span class="br0">&#123;</span></p>
<p><span class="kw1">if</span> <span class="br0">&#40;</span>Value == <span class="nu0">0</span> &amp;amp;&amp;amp; myBoolean == <span class="kw1">false</span><span class="br0">&#41;</span><br />
<span class="kw1">return</span> <span class="nu0">0</span>;</p>
<p><span class="kw1">if</span> <span class="br0">&#40;</span>Value == <span class="nu0">2</span> &amp;amp;&amp;amp; myBoolean == <span class="kw1">false</span><span class="br0">&#41;</span><br />
<span class="kw1">return</span> <span class="nu0">0</span>;</p>
<p><span class="kw1">if</span> <span class="br0">&#40;</span>Value == <span class="nu0">1</span> &amp;amp;&amp;amp; myBoolean == <span class="kw1">true</span><span class="br0">&#41;</span><br />
<span class="kw1">return</span> <span class="nu0">0</span>;</p>
<p><span class="kw1">return</span> <span class="nu0">1</span>;</p>
<p><span class="br0">&#125;</span></p>
<p><span class="kw1">public</span> <span class="kw4">int</span> CompareTo<span class="br0">&#40;</span>Trinary myTrinary<span class="br0">&#41;</span><br />
<span class="br0">&#123;</span></p>
<p><span class="kw1">if</span> <span class="br0">&#40;</span><span class="kw1">this</span>.<span class="me1">Equals</span><span class="br0">&#40;</span>myTrinary<span class="br0">&#41;</span><span class="br0">&#41;</span><br />
<span class="kw1">return</span> <span class="nu0">0</span>;</p>
<p><span class="kw1">return</span> <span class="nu0">1</span>;</p>
<p><span class="br0">&#125;</span></p>
<p><span class="co2">#region Operator overloading</span></p>
<p><span class="co2">#region Equals(myObject)</span></p>
<p><span class="kw1">public</span> <span class="kw1">override</span> Boolean Equals<span class="br0">&#40;</span><span class="kw4">Object</span> myObject<span class="br0">&#41;</span><br />
<span class="br0">&#123;</span></p>
<p><span class="co1">// Check if myObject is null</span><br />
<span class="kw1">if</span> <span class="br0">&#40;</span>myObject == <span class="kw1">null</span><span class="br0">&#41;</span><br />
<span class="kw1">return</span> <span class="kw1">false</span>;</p>
<p><span class="co1">// If parameter cannot be cast to Point return false.</span><br />
Trinary _Trinary = myObject <span class="kw1">as</span> Trinary;<br />
<span class="kw1">if</span> <span class="br0">&#40;</span><span class="br0">&#40;</span><span class="kw4">Object</span><span class="br0">&#41;</span>_Trinary == <span class="kw1">null</span><span class="br0">&#41;</span><br />
<span class="kw1">return</span> <span class="kw1">false</span>;</p>
<p><span class="kw1">return</span> Equals<span class="br0">&#40;</span>_Trinary<span class="br0">&#41;</span>;</p>
<p><span class="br0">&#125;</span></p>
<p><span class="co2">#endregion</span></p>
<p><span class="co2">#region Equals(myRevisionID)</span></p>
<p><span class="kw1">public</span> Boolean Equals<span class="br0">&#40;</span>Trinary myTrinary<span class="br0">&#41;</span><br />
<span class="br0">&#123;</span></p>
<p><span class="co1">// If parameter is null return false:</span><br />
<span class="kw1">if</span> <span class="br0">&#40;</span><span class="br0">&#40;</span><span class="kw4">Object</span><span class="br0">&#41;</span>myTrinary == <span class="kw1">null</span><span class="br0">&#41;</span><br />
<span class="kw1">return</span> <span class="kw1">false</span>;</p>
<p><span class="co1">// Check if the inner fields have the same values</span><br />
<span class="kw1">if</span> <span class="br0">&#40;</span>Value != myTrinary.<span class="me1">Value</span><span class="br0">&#41;</span><br />
<span class="kw1">return</span> <span class="kw1">false</span>;</p>
<p><span class="kw1">if</span> <span class="br0">&#40;</span>Name != myTrinary.<span class="me1">Name</span><span class="br0">&#41;</span><br />
<span class="kw1">return</span> <span class="kw1">false</span>;</p>
<p><span class="kw1">return</span> <span class="kw1">true</span>;</p>
<p><span class="br0">&#125;</span></p>
<p><span class="co2">#endregion</span></p>
<p><span class="co2">#region Operator == (myTrinary1, myTrinary2)</span></p>
<p><span class="kw1">public</span> <span class="kw1">static</span> Boolean <span class="kw1">operator</span> == <span class="br0">&#40;</span>Trinary myTrinary1, Trinary myTrinary2<span class="br0">&#41;</span><br />
<span class="br0">&#123;</span></p>
<p><span class="co1">// If both are null, or both are same instance, return true.</span><br />
<span class="kw1">if</span> <span class="br0">&#40;</span><span class="kw5">System</span>.<span class="kw4">Object</span>.<span class="me1">ReferenceEquals</span><span class="br0">&#40;</span>myTrinary1, myTrinary2<span class="br0">&#41;</span><span class="br0">&#41;</span><br />
<span class="kw1">return</span> <span class="kw1">true</span>;</p>
<p><span class="co1">// If one is null, but not both, return false.</span><br />
<span class="kw1">if</span> <span class="br0">&#40;</span><span class="br0">&#40;</span><span class="br0">&#40;</span><span class="kw4">Object</span><span class="br0">&#41;</span>myTrinary1 == <span class="kw1">null</span><span class="br0">&#41;</span> || <span class="br0">&#40;</span><span class="br0">&#40;</span><span class="kw4">Object</span><span class="br0">&#41;</span>myTrinary2 == <span class="kw1">null</span><span class="br0">&#41;</span><span class="br0">&#41;</span><br />
<span class="kw1">return</span> <span class="kw1">false</span>;</p>
<p><span class="kw1">return</span> myTrinary1.<span class="me1">Equals</span><span class="br0">&#40;</span>myTrinary2<span class="br0">&#41;</span>;</p>
<p><span class="br0">&#125;</span></p>
<p><span class="co2">#endregion</span></p>
<p><span class="co2">#region Operator != (myTrinary1, myTrinary2)</span></p>
<p><span class="kw1">public</span> <span class="kw1">static</span> Boolean <span class="kw1">operator</span> !=<span class="br0">&#40;</span>Trinary myTrinary1, Trinary myTrinary2<span class="br0">&#41;</span><br />
<span class="br0">&#123;</span><br />
<span class="kw1">return</span> !<span class="br0">&#40;</span>myTrinary1 == myTrinary2<span class="br0">&#41;</span>;<br />
<span class="br0">&#125;</span></p>
<p><span class="co2">#endregion</span></p>
<p><span class="co2">#region GetHashCode()</span></p>
<p><span class="kw1">public</span> <span class="kw1">override</span> <span class="kw4">int</span> GetHashCode<span class="br0">&#40;</span><span class="br0">&#41;</span><br />
<span class="br0">&#123;</span><br />
<span class="kw1">return</span> Value.<span class="me1">GetHashCode</span><span class="br0">&#40;</span><span class="br0">&#41;</span> ^ Name.<span class="me1">GetHashCode</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;<br />
<span class="br0">&#125;</span></p>
<p><span class="co2">#endregion</span></p>
<p><span class="co2">#endregion</span></p>
<p><span class="co2">#region ToString</span></p>
<p><span class="kw1">public</span> <span class="kw1">override</span> <span class="kw4">String</span> ToString<span class="br0">&#40;</span><span class="br0">&#41;</span><br />
<span class="br0">&#123;</span><br />
<span class="kw1">return</span> Name;<br />
<span class="br0">&#125;</span></p>
<p><span class="co2">#endregion</span></p>
<p><span class="br0">&#125;</span><br />
&nbsp;</div>
<p>Additionally it might be usefull to define an extension method to compare the standard Boolean to your new datastructure:</p>
<div class="dean_ch" style="white-space: wrap;">
<span class="kw1">public</span> <span class="kw1">static</span> <span class="kw4">class</span> TrinaryExtensionMethods<br />
<span class="br0">&#123;</span></p>
<p><span class="kw1">public</span> <span class="kw1">static</span> <span class="kw4">int</span> CompareTo<span class="br0">&#40;</span><span class="kw1">this</span> Boolean myBoolean, Trinary myTrinary<span class="br0">&#41;</span><br />
<span class="br0">&#123;</span></p>
<p><span class="kw1">if</span> <span class="br0">&#40;</span>myTrinary == Trinary.<span class="kw1">FALSE</span> &nbsp; &nbsp;&amp;amp;&amp;amp; myBoolean == <span class="kw1">false</span><span class="br0">&#41;</span><br />
<span class="kw1">return</span> <span class="nu0">0</span>;</p>
<p><span class="kw1">if</span> <span class="br0">&#40;</span>myTrinary == Trinary.<span class="me1">DELETED</span> &nbsp;&amp;amp;&amp;amp; myBoolean == <span class="kw1">false</span><span class="br0">&#41;</span><br />
<span class="kw1">return</span> <span class="nu0">0</span>;</p>
<p><span class="kw1">if</span> <span class="br0">&#40;</span>myTrinary == Trinary.<span class="kw1">TRUE</span> &nbsp; &nbsp; &amp;amp;&amp;amp; myBoolean == <span class="kw1">true</span><span class="br0">&#41;</span><br />
<span class="kw1">return</span> <span class="nu0">0</span>;</p>
<p><span class="kw1">return</span> <span class="nu0">1</span>;</p>
<p><span class="br0">&#125;</span></p>
<p><span class="br0">&#125;</span><br />
&nbsp;</div>
]]></content:encoded>
			<wfw:commentRss>http://blog.ahzf.de/index.php/2009/10/04/c-and-implicit-conversions/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>
