<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://msmvps.com/utility/FeedStylesheets/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/"><channel><title>Joacim's view on stuff : c#, widening</title><link>http://msmvps.com/blogs/joacim/archive/tags/c_2300_/widening/default.aspx</link><description>Tags: c#, widening</description><dc:language>en</dc:language><generator>CommunityServer 2008.5 SP2 (Build: 40407.4157)</generator><item><title>Boxing and Unboxing in .Net</title><link>http://msmvps.com/blogs/joacim/archive/2009/08/31/boxing-and-unboxing-in-net.aspx</link><pubDate>Mon, 31 Aug 2009 01:41:32 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1719615</guid><dc:creator>Joacim Andersson</dc:creator><slash:comments>9</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/joacim/rsscomments.aspx?PostID=1719615</wfw:commentRss><comments>http://msmvps.com/blogs/joacim/archive/2009/08/31/boxing-and-unboxing-in-net.aspx#comments</comments><description>&lt;p&gt;In this article I will try to explain the concepts of Boxing and Unboxing. There are two types of objects within the .Net framework, &lt;em&gt;value types&lt;/em&gt; and &lt;em&gt;reference types&lt;/em&gt;. Value types are stored on the &lt;a href="http://en.wikipedia.org/wiki/Call_stack" target="_blank"&gt;stack&lt;/a&gt; while reference types are always stored on the &lt;a href="http://en.wikipedia.org/wiki/Dynamic_memory_allocation" target="_blank"&gt;heap&lt;/a&gt;. Converting a value type into a reference type is called Boxing while converting it back from a reference type to a value type is called Unboxing.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Value Types&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;Value types are primitive types like System.Int32 (Integer in VB, int in C#) or System.Double. These types are mapped directly to the Framework Class Library (FCL) and are all derived from System.ValueType. Apart from the regular primitive types (integer, long, single, double, char, and so on) Enumerations and Structures also inherits from System.ValueTypes so they are also stored on the stack.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Reference Types&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;All classes are reference types and they are stored on the heap. So when you create a new instance of a class using the &lt;font color="#000080"&gt;new&lt;/font&gt; keyword, memory are allocated on the heap for the object and the memory address is returned. Strings are a special case since they are also reference types, even though they are often treated as if they where value types, but that’s not the case. The difference is that you don’t have to create an instance of a string in the same manner as you would with another class.&lt;/p&gt;  &lt;p&gt;Reference types are also Nullable, meaning that you can set the reference to Null (Nothing in VB).&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Widening and Narrowing conversions&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;Before we go into the Boxing and Unboxing I would like to take a moment to explain the difference between a widening and a narrowing conversion. A widening conversion is always safe since there is never any risk of any data loss. For example converting an Integer into a Long (System.Int64) is a widening conversion. There is no integer value that doesn’t fit into a Long so you can always do that. However doing the opposite, converting a Long into an Integer is more risky since there are a chance that you will lose some data, since a Long can contain a number that is too high (or too low) to fit into an integer.&lt;/p&gt;  &lt;p&gt;You can always use an implicit conversion when you do a widening conversion.&lt;/p&gt;  &lt;pre class="code"&gt;&lt;span style="color:blue;"&gt;Dim &lt;/span&gt;&lt;span style="color:black;"&gt;i &lt;/span&gt;&lt;span style="color:blue;"&gt;As Integer &lt;/span&gt;&lt;span style="color:red;"&gt;= 3
&lt;/span&gt;&lt;span style="color:blue;"&gt;Dim &lt;/span&gt;&lt;span style="color:black;"&gt;l &lt;/span&gt;&lt;span style="color:blue;"&gt;As Long
&lt;/span&gt;&lt;span style="color:black;"&gt;l &lt;/span&gt;&lt;span style="color:red;"&gt;= &lt;/span&gt;&lt;span style="color:black;"&gt;i &lt;/span&gt;&lt;span style="color:green;"&gt;&amp;#39;Implicit conversion
&lt;/span&gt;&lt;/pre&gt;
&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;

&lt;p&gt;However to do the opposite, a narrowing conversion, you need to do an explicit conversion.&lt;/p&gt;

&lt;pre class="code"&gt;&lt;span style="color:black;"&gt;i &lt;/span&gt;&lt;span style="color:red;"&gt;= &lt;/span&gt;&lt;span style="color:blue;"&gt;CType&lt;/span&gt;&lt;span style="color:black;"&gt;(l, &lt;/span&gt;&lt;span style="color:blue;"&gt;Integer&lt;/span&gt;&lt;span style="color:black;"&gt;) &lt;/span&gt;&lt;span style="color:green;"&gt;&amp;#39;Explicit conversion&lt;br /&gt;&amp;#39;or
&lt;/span&gt;&lt;span style="color:black;"&gt;i &lt;/span&gt;&lt;span style="color:red;"&gt;= &lt;/span&gt;&lt;span style="color:blue;"&gt;CInt&lt;/span&gt;&lt;span style="color:black;"&gt;(l) &lt;/span&gt;&lt;span style="color:green;"&gt;&amp;#39;Explicit conversion
&lt;/span&gt;&lt;/pre&gt;
&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;

&lt;p&gt;If you don’t do an explicit conversion when you’re doing a narrowing conversion you will get a compilation error so your project will not compile (Note, VB can allow you to do an implicit conversion if you have Option Strict set to Off, something I strongly advice you not to have, C# however will never allow it). If the Long value does not fit into the Integer you will however still get a runtime error since the system will then throw a System.OverflowExeption. So when you do a narrowing conversion you must be sure that it can be done.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Doing Boxing/Unboxing&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;As mentioned earlier Boxing refers to the conversion of a value type to a reference type.&lt;/p&gt;

&lt;pre class="code"&gt;&lt;span style="color:blue;"&gt;Dim &lt;/span&gt;&lt;span style="color:black;"&gt;i &lt;/span&gt;&lt;span style="color:blue;"&gt;As Integer &lt;/span&gt;&lt;span style="color:red;"&gt;= 3
&lt;/span&gt;&lt;span style="color:blue;"&gt;Dim &lt;/span&gt;&lt;span style="color:black;"&gt;o &lt;/span&gt;&lt;span style="color:blue;"&gt;As Object
&lt;/span&gt;&lt;span style="color:black;"&gt;o &lt;/span&gt;&lt;span style="color:red;"&gt;= &lt;/span&gt;&lt;span style="color:black;"&gt;i &lt;/span&gt;&lt;span style="color:green;"&gt;&amp;#39;Boxing the Integer into an object (reference type)&lt;/span&gt;&lt;/pre&gt;
&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;

&lt;p&gt;Above I do an implicit conversion of an integer to an object. This is possible since it’s a widening conversion so there is no risk of any data loss. However doing the opposite, converting the object to an integer is a narrowing conversion, where there is a risk that data will be lost.&lt;/p&gt;

&lt;pre class="code"&gt;&lt;span style="color:black;"&gt;i &lt;/span&gt;&lt;span style="color:red;"&gt;= &lt;/span&gt;&lt;span style="color:black;"&gt;o &lt;/span&gt;&lt;span style="color:green;"&gt;&amp;#39;Implicitly doing a narrowing conversion (not allowed)
&lt;/span&gt;&lt;span style="color:black;"&gt;i &lt;/span&gt;&lt;span style="color:red;"&gt;= &lt;/span&gt;&lt;span style="color:blue;"&gt;CInt&lt;/span&gt;&lt;span style="color:black;"&gt;(o) &lt;/span&gt;&lt;span style="color:green;"&gt;&amp;#39;Explicitly doing a narrowing conversion (allowed)&lt;/span&gt;&lt;/pre&gt;
&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;

&lt;p&gt;In C# if you have boxed a particular type you must unbox it to the same type. You can not box an integer to an object and then unbox it to a long.&lt;/p&gt;

&lt;pre class="code"&gt;&lt;span style="color:blue;"&gt;int &lt;/span&gt;i = 3;
&lt;span style="color:blue;"&gt;long &lt;/span&gt;l;
&lt;span style="color:blue;"&gt;object &lt;/span&gt;o;
o = i;
l = (&lt;span style="color:blue;"&gt;long&lt;/span&gt;)o; &lt;span style="color:green;"&gt;//will throw a System.InvalidCastException&lt;/span&gt;&lt;/pre&gt;

&lt;p&gt;&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;For the above to work, you must first unbox it to an integer and then cast it to a long.&lt;/p&gt;

&lt;pre class="code"&gt;&lt;font color="#0000ff"&gt;int&lt;/font&gt; i = 3;
&lt;span style="color:blue;"&gt;long &lt;/span&gt;l;
&lt;span style="color:blue;"&gt;object &lt;/span&gt;o;
o = i;
l = (&lt;font color="#0000ff"&gt;long&lt;/font&gt;)(&lt;span style="color:blue;"&gt;int&lt;/span&gt;)o;&lt;/pre&gt;
&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;

&lt;p&gt;However the VB’s type conversion functions (CType and the more specific CInt, CLng, CDbl and so on) does allow this.&lt;/p&gt;

&lt;pre class="code"&gt;&lt;span style="color:blue;"&gt;Dim &lt;/span&gt;i &lt;span style="color:blue;"&gt;As Integer &lt;/span&gt;= 3
&lt;span style="color:blue;"&gt;Dim &lt;/span&gt;l &lt;span style="color:blue;"&gt;As Long
Dim &lt;/span&gt;o &lt;span style="color:blue;"&gt;As Object
&lt;/span&gt;o = i
l = &lt;span style="color:blue;"&gt;CLng&lt;/span&gt;(o) &lt;span style="color:green;"&gt;&amp;#39;allowed&lt;/span&gt;&lt;/pre&gt;
&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;

&lt;p&gt;&lt;strong&gt;End words&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I hope that you by now have a better understanding of Boxing and Unboxing. So let me end this article by saying that you should avoid doing this if possible. Doing type conversion is time consuming, and that is especially true when it comes to Boxing and Unboxing since data have to be transferred back and forth between the stack and the heap. Using Generics, which has existed in .Net since version 2.0, is a much better approach than having to deal with value type to reference type conversion.&lt;/p&gt;

&lt;p&gt;I will cover Generics in a later article.&lt;/p&gt;

&lt;p&gt;Have fun.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=1719615" width="1" height="1"&gt;</description><category domain="http://msmvps.com/blogs/joacim/archive/tags/vb/default.aspx">vb</category><category domain="http://msmvps.com/blogs/joacim/archive/tags/visual+basic/default.aspx">visual basic</category><category domain="http://msmvps.com/blogs/joacim/archive/tags/.net/default.aspx">.net</category><category domain="http://msmvps.com/blogs/joacim/archive/tags/boxing/default.aspx">boxing</category><category domain="http://msmvps.com/blogs/joacim/archive/tags/widening/default.aspx">widening</category><category domain="http://msmvps.com/blogs/joacim/archive/tags/unboxing/default.aspx">unboxing</category><category domain="http://msmvps.com/blogs/joacim/archive/tags/conversion/default.aspx">conversion</category><category domain="http://msmvps.com/blogs/joacim/archive/tags/c_2300_/default.aspx">c#</category><category domain="http://msmvps.com/blogs/joacim/archive/tags/narrowing/default.aspx">narrowing</category></item></channel></rss>