<?xml version="1.0" encoding="utf-8"?>
<rss xmlns:atom="https://www.w3.org/2005/Atom" xmlns:sy="https://purl.org/rss/1.0/modules/syndication/" xmlns:dc="https://purl.org/dc/elements/1.1/" xmlns:content="https://purl.org/rss/1.0/modules/content/" xmlns:wfw="https://wellformedweb.org/CommentAPI/" xmlns:slash="https://purl.org/rss/1.0/modules/slash/"
  version="2.0">
  <channel>
    <title>Sid's Blog</title>
    <atom:link
      href="https://docs.microsoft.com/archive/blogs/siddjain/feed.xml"
      rel="self"
      type="application/rss+xml" />
    <link>https://docs.microsoft.com/archive/blogs/siddjain/feed.xml</link>
    <description>everything should be made as simple as possible, but no simpler</description>
    <lastBuildDate>Wed, 17 Apr 2019 04:09:32 GMT</lastBuildDate>
    <language>en-US</language>
    <sy:updatePeriod>hourly</sy:updatePeriod>
    <sy:updateFrequency>1</sy:updateFrequency>
    <item>
      <title>Invert Dictionary</title>
      <link>https://docs.microsoft.com/archive/blogs/siddjain/invert-dictionary</link>
      <pubDate>Fri, 01 Jun 2012 19:16:33 GMT</pubDate>
      <dc:creator><![CDATA[siddjain]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/siddjain/2012/06/01/invert-dictionary/</guid>
      <description><![CDATA[using System.Collections.Generic;using System.Linq;namespace ExtensionMethods{    public static...]]></description>
      <content:encoded><![CDATA[<pre>using System.Collections.Generic;<br />using System.Linq;<br /><br />namespace ExtensionMethods<br />{<br />    public static class MyExtensionMethods<br />    {<br />        public static Dictionary&lt;V, K[]&gt; Invert&lt;K, V&gt;(this Dictionary&lt;K, V[]&gt; dict)<br />        {<br />            var x = new Dictionary&lt;V, IList&lt;K&gt;&gt;();<br />            foreach (var kvp in dict)<br />            {<br />                if (kvp.Value != null)<br />                {<br />                    foreach (var value in kvp.Value)<br />                    {<br />                        IList&lt;K&gt; list;<br />                        if (!x.TryGetValue(value, out list))<br />                        {<br />                            x[value] = list = new List&lt;K&gt;();<br />                        }<br />                        if (!list.Contains(kvp.Key))<br />                        {<br />                            list.Add(kvp.Key);<br />                        }<br />                    }<br />                }<br />            }<br />            var answer = new Dictionary&lt;V, K[]&gt;();<br />            foreach (var kvp in x)<br />            {<br />                answer[kvp.Key] = kvp.Value.ToArray();<br />            }<br />            return answer;<br />        }<br />    }<br />}</pre>
<pre></pre>
<pre>static void TestInvertDictionary(string[] args)<br />        {<br />            Dictionary&lt;string, string[]&gt; dict = new Dictionary&lt;string, string[]&gt;();<br />            dict["0"] = new string[] { "a", "b", "c" };<br />            dict["1"] = new string[] { "b", "c", "d" };<br />            dict["2"] = null;<br />            dict["3"] = new string[] { "x", "y", "z" };<br />            dict["4"] = new string[] { "s", "i", "d" };<br />            dict["5"] = new string[] { "p", "o", "o", "j", "a" };            <br />            foreach (var kvp in dict.Invert())<br />            {<br />                Console.Write(kvp.Key + " : ");<br />                foreach (var item in kvp.Value)<br />                {<br />                    Console.Write(item + " , ");<br />                }<br />                Console.WriteLine();<br />            }<br />            Console.ReadLine();<br />        }</pre>]]></content:encoded>
    </item>
    <item>
      <title>Compressing MemoryStreams with GZipStream</title>
      <link>https://docs.microsoft.com/archive/blogs/siddjain/compressing-memorystreams-with-gzipstream</link>
      <pubDate>Sat, 26 Mar 2011 20:12:20 GMT</pubDate>
      <dc:creator><![CDATA[siddjain]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/siddjain/2011/03/26/compressing-memorystreams-with-gzipstream/</guid>
      <description><![CDATA[There is a silly pattern to follow while Compressing MemoryStreams with GZipStream. It is documented...]]></description>
      <content:encoded><![CDATA[<p>There is a silly pattern to follow while Compressing MemoryStreams with GZipStream. It is documented at&nbsp;<a href="https://blogs.msdn.com/b/bclteam/archive/2006/05/10/592551.aspx">https://blogs.msdn.com/b/bclteam/archive/2006/05/10/592551.aspx</a>. Make sure to Close the GZipStream (which will also Close the underlying MemoryStream), and then call the ToArray() method of MemoryStream to return the compressed bytes as an array. Then you can write this array to a new instance of a MemoryStream. I recommend writing extension methods on MemoryStream class to compress and decompress.</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p><span></span></p>
<p class="MsoNormal">&nbsp;</p>
<p>&nbsp;</p>]]></content:encoded>
    </item>
    <item>
      <title>Writing a console app that access Azure Storage</title>
      <link>https://docs.microsoft.com/archive/blogs/siddjain/writing-a-console-app-that-access-azure-storage</link>
      <pubDate>Thu, 22 Jul 2010 17:01:00 GMT</pubDate>
      <dc:creator><![CDATA[siddjain]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/siddjain/2010/07/22/writing-a-console-app-that-access-azure-storage/</guid>
      <description><![CDATA[Yes, it is possible to write a console app that accesses Azure Storage. I encountered...]]></description>
      <content:encoded><![CDATA[<!-- code formatted by https://manoli.net/csharpformat/ -->
<p>

</p>
<p>Yes, it is possible to write a console app that accesses Azure Storage. I encountered several gotcha's in this process. My first attempt to write a console app that uploaded some files to azure resulted in something like this:</p>
<pre class="scroll"><code class="csharp">using System;
<br />using System.Configuration;
<br />using System.IO;
<br />using Microsoft.WindowsAzure;
<br />using Microsoft.WindowsAzure.StorageClient;
<br />...
<br />var storageAccount = CloudStorageAccount.FromConfigurationSetting("myConnectionString");
<br />CloudBlobClient blobClient = storageAccount.CreateCloudBlobClient();
<br />CloudBlobContainer blobContainer = blobClient.GetContainerReference(container);
<br />blobContainer.CreateIfNotExist();                
<br />DirectoryInfo di = new DirectoryInfo(directory);
<br />foreach (FileInfo fi in di.GetFiles(searchPattern))
<br />{
<br />    string name = fi.Name;
<br />    var blob = blobContainer.GetBlobReference(name);
<br />    blob.UploadFile(fi.FullName);                 
<br />    Console.WriteLine("uploaded " + fi.FullName);
<br />}</code></pre>
<p>where myConnectionString is defined in app.config like so:</p>
<!-- code formatted by https://manoli.net/csharpformat/ -->
<pre class="csharpcode">&lt;?xml version=<span class="str">"1.0"</span> encoding=<span class="str">"utf-8"</span> ?&gt;
&lt;configuration&gt;
  &lt;connectionStrings&gt;
    &lt;add name=<span class="str">"myConnectionString"</span> connectionString=<span class="str">"DefaultEndpointsProtocol=http;AccountName=XXX;AccountKey=XXX"</span>/&gt;
  &lt;/connectionStrings&gt;  
&lt;/configuration&gt;</pre>
<p><strong>GOTCHA #1</strong></p>
<p>Running this code gave me following exception:</p>
<p><br />System.Runtime.InteropServices.SEHException was caught Message=External component has thrown an exception. Source=msshrtmi ErrorCode=-2147467259 <br />StackTrace: <br />at RoleEnvironmentGetConfigurationSettingValueW(UInt16* , UInt16* , UInt64 , UInt64* ) <br />at Microsoft.WindowsAzure.ServiceRuntime.Internal.InteropRoleManager.GetConfigurationSetting(String name, String&amp; ret) <br />at Microsoft.WindowsAzure.ServiceRuntime.RoleEnvironment.GetConfigurationSettingValue(String configurationSettingName) <br />at AzureUpload.Program.<init></init><init></init><init></init><init></init><init></init><init></init><init></init><init></init><init></init><init></init><init></init><init></init><init></init><init></init><init></init><init></init><init></init><init></init><init></init><init></init><init></init><init></init><init></init><init></init><init></init><init></init><init></init><init></init><init></init><init></init><init></init><init></init><init></init><init></init><init></init><init></init><init></init><init></init><init></init><init></init><init></init><init></init><init></init><init></init><init></init><init></init><init></init><init></init><init></init><init></init><init></init><init></init><init></init><init></init><init></init><init></init><init></init><init></init><init></init><init></init><init></init><init></init><init></init><init></init>b__2(String configName, Func`2 configSetter) in C:\Users\siddjain\Documents\Visual Studio 2010\Projects\ConsoleAplication1\Program.cs:line 51 <br />at Microsoft.WindowsAzure.CloudStorageAccount.StorageAccountConfigurationSetting..ctor(String configurationSettingName) <br />at Microsoft.WindowsAzure.CloudStorageAccount.FromConfigurationSetting(String settingName) <br />at AzureUpload.Program.UploadBlob(String directory, String searchPattern, String </p>
<p>This <a href="https://social.msdn.microsoft.com/Forums/en-US/windowsazure/thread/e24089fd-85a0-4483-bcfd-e7ac20e87dd8/">post</a> explains how to fix it. Azure calls into your code to get the configuration string. Hence, you need to define a method that will return the config string to azure, before you call </p>
<pre class="scroll"><code class="csharp">CloudStorageAccount.FromConfigurationSetting("myConnectionString")</code></pre>
<p>. The fix was to add following code: <!-- code formatted by https://manoli.net/csharpformat/ --></p>
<pre class="csharpcode">CloudStorageAccount.SetConfigurationSettingPublisher((configName, configSetter) =&gt;
{
   <span class="rem">// for a console app, reading from App.config</span>
   configSetter(ConfigurationManager.ConnectionStrings[configName].ConnectionString);
   <span class="rem">// OR, if running in the Windows Azure environment</span>
   <span class="rem">// configSetter(RoleEnvironment.GetConfigurationSettingValue(configName));</span>
});</pre>
<p>Alternatively, use the CloudStorageAccount.Parse method instead of CloudStorageAccount.FromConfigurationSetting.</p>
<p><strong>GOTCHA #2</strong></p>
<p>I was able to upload blobs now, but couldn't access them in IE. Kept getting 404s. To fix this, we need to mark the container as public as in:</p>
<!-- code formatted by https://manoli.net/csharpformat/ -->
<pre class="csharpcode"><span class="kwrd">if</span> (blobContainer.CreateIfNotExist())
{
    blobContainer.SetPermissions(<span class="kwrd">new</span> BlobContainerPermissions
        { PublicAccess = BlobContainerPublicAccessType.Blob }
    );
}</pre>
<p><strong>GOTCHA #3</strong></p>
<p>the '/' character is OK to use in blob name (it gives the illusion of a hierarchy), but not OK to use in container name. </p>
<p><strong>GOTCHA #4</strong></p>
<p>I tried following container name "TestContainer" and got an exception at blobContainer.CreateIfNotExist() with following message: One of the request inputs is out of range. It turns out upper case characters are not permitted in container names. See this post: <a href="https://msdn.microsoft.com/en-us/library/dd135715.aspx">https://msdn.microsoft.com/en-us/library/dd135715.aspx</a> </p>
<p><strong>GOTCHA&nbsp;#5</strong></p>
<p>You may find yourself in following scenario: you have a container that stores a number of blobs. This container's contents need to be periodically updated. When updating, you want to delete previous contents of the container. If you believe in writing least amount of code, you would probably delete the container, re-create it, and upload new blobs&nbsp;like this:</p>
<p>blobContainer.Delete();<br /><span style="font-family: OCR A; color: #400080; font-size: small;"><span style="font-family: OCR A; color: #400080; font-size: small;"><span style="font-family: OCR A; color: #400080; font-size: small;">if</span></span></span><span style="font-family: OCR A; font-size: small;"><span style="font-family: OCR A; font-size: small;"> (</span></span><span style="font-family: OCR A; color: #010001; font-size: small;"><span style="font-family: OCR A; color: #010001; font-size: small;"><span style="font-family: OCR A; color: #010001; font-size: small;">blobContainer</span></span></span><span style="font-family: OCR A; color: #2e53d1; font-size: small;"><span style="font-family: OCR A; color: #2e53d1; font-size: small;"><span style="font-family: OCR A; color: #2e53d1; font-size: small;">.</span></span></span><span style="font-family: OCR A; color: #010001; font-size: small;"><span style="font-family: OCR A; color: #010001; font-size: small;"><span style="font-family: OCR A; color: #010001; font-size: small;">CreateIfNotExist</span></span></span><span style="font-family: OCR A; font-size: small;"><span style="font-family: OCR A; font-size: small;">())<br />{<br /></span></span><span style="font-family: OCR A; color: #010001; font-size: small;"><span style="font-family: OCR A; color: #010001; font-size: small;"><span style="font-family: OCR A; color: #010001; font-size: small;">&nbsp;&nbsp;&nbsp; blobContainer</span></span></span><span style="font-family: OCR A; color: #2e53d1; font-size: small;"><span style="font-family: OCR A; color: #2e53d1; font-size: small;"><span style="font-family: OCR A; color: #2e53d1; font-size: small;">.</span></span></span><span style="font-family: OCR A; color: #010001; font-size: small;"><span style="font-family: OCR A; color: #010001; font-size: small;"><span style="font-family: OCR A; color: #010001; font-size: small;">SetPermissions</span></span></span><span style="font-family: OCR A; font-size: small;"><span style="font-family: OCR A; font-size: small;">(</span></span><span style="font-family: OCR A; color: #400080; font-size: small;"><span style="font-family: OCR A; color: #400080; font-size: small;"><span style="font-family: OCR A; color: #400080; font-size: small;">new</span></span></span><span style="font-family: OCR A; font-size: small;"><span style="font-family: OCR A; font-size: small;"> </span></span><span style="font-family: OCR A; color: #305fb6; font-size: small;"><span style="font-family: OCR A; color: #305fb6; font-size: small;"><span style="font-family: OCR A; color: #305fb6; font-size: small;">BlobContainerPermissions</span></span></span><span style="font-family: OCR A; font-size: small;"><span style="font-family: OCR A; font-size: small;"> { </span></span><span style="font-family: OCR A; color: #010001; font-size: small;"><span style="font-family: OCR A; color: #010001; font-size: small;"><span style="font-family: OCR A; color: #010001; font-size: small;">PublicAccess</span></span></span><span style="font-family: OCR A; font-size: small;"><span style="font-family: OCR A; font-size: small;"> </span></span><span style="font-family: OCR A; color: #2e53d1; font-size: small;"><span style="font-family: OCR A; color: #2e53d1; font-size: small;"><span style="font-family: OCR A; color: #2e53d1; font-size: small;">=</span></span></span><span style="font-family: OCR A; font-size: small;"><span style="font-family: OCR A; font-size: small;"> </span></span><span style="font-family: OCR A; color: #2b91af; font-size: small;"><span style="font-family: OCR A; color: #2b91af; font-size: small;"><span style="font-family: OCR A; color: #2b91af; font-size: small;">BlobContainerPublicAccessType</span></span></span><span style="font-family: OCR A; color: #2e53d1; font-size: small;"><span style="font-family: OCR A; color: #2e53d1; font-size: small;"><span style="font-family: OCR A; color: #2e53d1; font-size: small;">.</span></span></span><span style="font-family: OCR A; color: #010001; font-size: small;"><span style="font-family: OCR A; color: #010001; font-size: small;"><span style="font-family: OCR A; color: #010001; font-size: small;">Container</span></span></span><span style="font-family: OCR A; font-size: small;"><span style="font-family: OCR A; font-size: small;"> });<br />}<br />// start uploading new blobs</span></span></p>
<p><span style="font-family: OCR A; font-size: small;"><span style="font-family: OCR A; font-size: small;">this is not going to work, and you will get a StorageClientException with the message "container does not exist" when you try to upload a blob. If you stick a breakpoint at<br />&nbsp;<span style="color: #010001;">&nbsp;&nbsp;&nbsp; blobContainer</span><span style="font-family: OCR A; color: #2e53d1; font-size: small;"><span style="font-family: OCR A; color: #2e53d1; font-size: small;"><span style="font-family: OCR A; color: #2e53d1; font-size: small;">.</span></span></span><span style="font-family: OCR A; color: #010001; font-size: small;"><span style="font-family: OCR A; color: #010001; font-size: small;"><span style="font-family: OCR A; color: #010001; font-size: small;">SetPermissions</span></span></span><span style="font-family: OCR A; font-size: small;"><span style="font-family: OCR A; font-size: small;">(</span></span><span style="font-family: OCR A; color: #400080; font-size: small;"><span style="font-family: OCR A; color: #400080; font-size: small;"><span style="font-family: OCR A; color: #400080; font-size: small;">new</span></span></span><span style="font-family: OCR A; font-size: small;"><span style="font-family: OCR A; font-size: small;"> </span></span><span style="font-family: OCR A; color: #305fb6; font-size: small;"><span style="font-family: OCR A; color: #305fb6; font-size: small;"><span style="font-family: OCR A; color: #305fb6; font-size: small;">BlobContainerPermissions</span></span></span><span style="font-family: OCR A; font-size: small;"><span style="font-family: OCR A; font-size: small;"> { </span></span><span style="font-family: OCR A; color: #010001; font-size: small;"><span style="font-family: OCR A; color: #010001; font-size: small;"><span style="font-family: OCR A; color: #010001; font-size: small;">PublicAccess</span></span></span><span style="font-family: OCR A; font-size: small;"><span style="font-family: OCR A; font-size: small;"> </span></span><span style="font-family: OCR A; color: #2e53d1; font-size: small;"><span style="font-family: OCR A; color: #2e53d1; font-size: small;"><span style="font-family: OCR A; color: #2e53d1; font-size: small;">=</span></span></span><span style="font-family: OCR A; font-size: small;"><span style="font-family: OCR A; font-size: small;"> </span></span><span style="font-family: OCR A; color: #2b91af; font-size: small;"><span style="font-family: OCR A; color: #2b91af; font-size: small;"><span style="font-family: OCR A; color: #2b91af; font-size: small;">BlobContainerPublicAccessType</span></span></span><span style="font-family: OCR A; color: #2e53d1; font-size: small;"><span style="font-family: OCR A; color: #2e53d1; font-size: small;"><span style="font-family: OCR A; color: #2e53d1; font-size: small;">.</span></span></span><span style="font-family: OCR A; color: #010001; font-size: small;"><span style="font-family: OCR A; color: #010001; font-size: small;"><span style="font-family: OCR A; color: #010001; font-size: small;">Container</span></span></span><span style="font-family: OCR A; font-size: small;"><span style="font-family: OCR A; font-size: small;"> });<br />you will find this breakpoint is not hit. Thus, it seems <span style="color: #010001;">blobContainer</span><span style="font-family: OCR A; color: #2e53d1; font-size: small;"><span style="font-family: OCR A; color: #2e53d1; font-size: small;"><span style="font-family: OCR A; color: #2e53d1; font-size: small;">.</span></span></span><span style="font-family: OCR A; color: #010001; font-size: small;"><span style="font-family: OCR A; color: #010001; font-size: small;"><span style="font-family: OCR A; color: #010001; font-size: small;">CreateIfNotExist</span></span></span><span style="font-family: OCR A; font-size: small;"><span style="font-family: OCR A; font-size: small;">() thinks that the container already exists even though we have deleted it in the very previous line. So what's the catch? The issue is documented here: <a href="https://social.msdn.microsoft.com/Forums/en-US/windowsazuredata/thread/f9ceaea3-be5b-40e0-a23d-bacea451d53d">https://social.msdn.microsoft.com/Forums/en-US/windowsazuredata/thread/f9ceaea3-be5b-40e0-a23d-bacea451d53d</a>. </span></span></span></span></span></span><span style="font-family: OCR A; font-size: small;"><span style="font-family: OCR A; font-size: small;"><span style="font-family: OCR A; font-size: small;"><span style="font-family: OCR A; font-size: small;"><span style="font-family: OCR A; font-size: small;"><span style="font-family: OCR A; font-size: small;">Calling <span style="font-size: x-small;"><span style="font-size: small;">b</span><span style="font-size: small;"><span style="font-size: small;">lob</span>Container.Delete(); just marks and queues up the&nbsp;container for deletion. When it returns, it is not guaranteed that the container has been deleted. To get around this issue, instead of calling blobContainer.Delete(), use following code:</span></span></span></span></span></span></span></span></p>
<p><span style="font-family: OCR A; font-size: small;"><span style="font-family: OCR A; font-size: small;"><span style="font-family: OCR A; font-size: small;"><span style="font-family: OCR A; font-size: small;"><span style="font-family: OCR A; font-size: small;"><span style="font-family: OCR A; font-size: small;"><span style="font-size: x-small;"><span style="font-size: small;"></span></span></span></span></span></span></span></span><span style="font-family: OCR A; font-size: small;"><span style="font-family: OCR A; font-size: small;"><span style="font-family: OCR A; font-size: small;"><span style="font-family: OCR A; font-size: small;"><span style="font-family: OCR A; color: #400080; font-size: small;"><span style="font-family: OCR A; color: #400080; font-size: small;"><span style="font-family: OCR A; color: #400080; font-size: small;"><span style="font-family: OCR A; color: #400080; font-size: small;"><span style="font-family: OCR A; color: #400080; font-size: small;"><span style="font-family: OCR A; color: #400080; font-size: small;"><span style="font-family: OCR A; color: #400080; font-size: small;"><span style="font-family: OCR A; color: #400080; font-size: small;"><span style="font-family: OCR A; color: #400080; font-size: small;">public void</span></span></span><span style="font-family: OCR A; font-size: small;"><span style="font-family: OCR A; font-size: small;"><span style="color: #000000;"> </span></span></span><span style="font-family: OCR A; color: #010001; font-size: small;"><span style="font-family: OCR A; color: #010001; font-size: small;"><span style="font-family: OCR A; color: #010001; font-size: small;">EmptyContainer</span></span></span><span style="font-family: OCR A; font-size: small;"><span style="font-family: OCR A; font-size: small;"><span style="color: #000000;">(</span></span></span><span style="font-family: OCR A; color: #400080; font-size: small;"><span style="font-family: OCR A; color: #400080; font-size: small;"><span style="font-family: OCR A; color: #400080; font-size: small;">string</span></span></span><span style="font-family: OCR A; font-size: small;"><span style="font-family: OCR A; font-size: small;"><span style="color: #000000;"> </span></span></span><span style="font-family: OCR A; color: #010001; font-size: small;"><span style="font-family: OCR A; color: #010001; font-size: small;"><span style="font-family: OCR A; color: #010001; font-size: small;">containerName</span></span></span><span style="font-family: OCR A; font-size: small;"><span style="font-family: OCR A; font-size: small;"><span style="color: #000000;">)<br />{<br />&nbsp;&nbsp; </span></span></span><span style="font-family: OCR A; color: #400080; font-size: small;"><span style="font-family: OCR A; color: #400080; font-size: small;"><span style="font-family: OCR A; color: #400080; font-size: small;">var</span></span></span><span style="font-family: OCR A; font-size: small;"><span style="font-family: OCR A; font-size: small;"><span style="color: #000000;"> </span></span></span><span style="font-family: OCR A; color: #010001; font-size: small;"><span style="font-family: OCR A; color: #010001; font-size: small;"><span style="font-family: OCR A; color: #010001; font-size: small;">container</span></span></span><span style="font-family: OCR A; font-size: small;"><span style="font-family: OCR A; font-size: small;"><span style="color: #000000;"> </span></span></span><span style="font-family: OCR A; color: #2e53d1; font-size: small;"><span style="font-family: OCR A; color: #2e53d1; font-size: small;"><span style="font-family: OCR A; color: #2e53d1; font-size: small;">=</span></span></span><span style="font-family: OCR A; font-size: small;"><span style="font-family: OCR A; font-size: small;"><span style="color: #000000;"> </span></span></span><span style="font-family: OCR A; color: #010001; font-size: small;"><span style="font-family: OCR A; color: #010001; font-size: small;"><span style="font-family: OCR A; color: #010001; font-size: small;">client</span></span></span><span style="font-family: OCR A; color: #2e53d1; font-size: small;"><span style="font-family: OCR A; color: #2e53d1; font-size: small;"><span style="font-family: OCR A; color: #2e53d1; font-size: small;">.</span></span></span><span style="font-family: OCR A; color: #010001; font-size: small;"><span style="font-family: OCR A; color: #010001; font-size: small;"><span style="font-family: OCR A; color: #010001; font-size: small;">GetContainerReference</span></span></span><span style="font-family: OCR A; font-size: small;"><span style="font-family: OCR A; font-size: small;"><span style="color: #000000;">(</span></span></span><span style="font-family: OCR A; color: #010001; font-size: small;"><span style="font-family: OCR A; color: #010001; font-size: small;"><span style="font-family: OCR A; color: #010001; font-size: small;">containerName</span></span></span><span style="font-family: OCR A; font-size: small;"><span style="font-family: OCR A; font-size: small;"><span style="color: #000000;">);<br />&nbsp;&nbsp; </span></span></span><span style="font-family: OCR A; color: #400080; font-size: small;"><span style="font-family: OCR A; color: #400080; font-size: small;"><span style="font-family: OCR A; color: #400080; font-size: small;">if</span></span></span><span style="font-family: OCR A; font-size: small;"><span style="font-family: OCR A; font-size: small;"><span style="color: #000000;"> (</span></span></span><span style="font-family: OCR A; color: #010001; font-size: small;"><span style="font-family: OCR A; color: #010001; font-size: small;"><span style="font-family: OCR A; color: #010001; font-size: small;">ContainerExists</span></span></span><span style="font-family: OCR A; font-size: small;"><span style="font-family: OCR A; font-size: small;"><span style="color: #000000;">(</span></span></span><span style="font-family: OCR A; color: #010001; font-size: small;"><span style="font-family: OCR A; color: #010001; font-size: small;"><span style="font-family: OCR A; color: #010001; font-size: small;">container</span></span></span><span style="font-family: OCR A; font-size: small;"><span style="font-family: OCR A; font-size: small;"><span style="color: #000000;">))&nbsp;<br />&nbsp;&nbsp; {<br /></span></span></span><span style="font-family: OCR A; color: #400080; font-size: small;"><span style="font-family: OCR A; color: #400080; font-size: small;"><span style="font-family: OCR A; color: #400080; font-size: small;">&nbsp;&nbsp;&nbsp; &nbsp; foreach</span></span></span><span style="font-family: OCR A; font-size: small;"><span style="font-family: OCR A; font-size: small;"><span style="color: #000000;"> (</span></span></span><span style="font-family: OCR A; color: #400080; font-size: small;"><span style="font-family: OCR A; color: #400080; font-size: small;"><span style="font-family: OCR A; color: #400080; font-size: small;">var</span></span></span><span style="font-family: OCR A; font-size: small;"><span style="font-family: OCR A; font-size: small;"><span style="color: #000000;"> </span></span></span><span style="font-family: OCR A; color: #010001; font-size: small;"><span style="font-family: OCR A; color: #010001; font-size: small;"><span style="font-family: OCR A; color: #010001; font-size: small;">item</span></span></span><span style="font-family: OCR A; font-size: small;"><span style="font-family: OCR A; font-size: small;"><span style="color: #000000;"> </span></span></span><span style="font-family: OCR A; color: #400080; font-size: small;"><span style="font-family: OCR A; color: #400080; font-size: small;"><span style="font-family: OCR A; color: #400080; font-size: small;">in</span></span></span><span style="font-family: OCR A; font-size: small;"><span style="font-family: OCR A; font-size: small;"><span style="color: #000000;"> </span></span></span><span style="font-family: OCR A; color: #010001; font-size: small;"><span style="font-family: OCR A; color: #010001; font-size: small;"><span style="font-family: OCR A; color: #010001; font-size: small;">container</span></span></span><span style="font-family: OCR A; color: #2e53d1; font-size: small;"><span style="font-family: OCR A; color: #2e53d1; font-size: small;"><span style="font-family: OCR A; color: #2e53d1; font-size: small;">.</span></span></span><span style="font-family: OCR A; color: #010001; font-size: small;"><span style="font-family: OCR A; color: #010001; font-size: small;"><span style="font-family: OCR A; color: #010001; font-size: small;">ListBlobs</span></span></span><span style="font-family: OCR A; font-size: small;"><span style="font-family: OCR A; font-size: small;"><span style="color: #000000;">())<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br /></span></span></span><span style="font-family: OCR A; color: #305fb6; font-size: small;"><span style="font-family: OCR A; color: #305fb6; font-size: small;"><span style="font-family: OCR A; color: #305fb6; font-size: small;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CloudBlob</span></span></span><span style="font-family: OCR A; font-size: small;"><span style="font-family: OCR A; font-size: small;"><span style="color: #000000;"> </span></span></span><span style="font-family: OCR A; color: #010001; font-size: small;"><span style="font-family: OCR A; color: #010001; font-size: small;"><span style="font-family: OCR A; color: #010001; font-size: small;">blob</span></span></span><span style="font-family: OCR A; font-size: small;"><span style="font-family: OCR A; font-size: small;"><span style="color: #000000;"> </span></span></span><span style="font-family: OCR A; color: #2e53d1; font-size: small;"><span style="font-family: OCR A; color: #2e53d1; font-size: small;"><span style="font-family: OCR A; color: #2e53d1; font-size: small;">=</span></span></span><span style="font-family: OCR A; font-size: small;"><span style="font-family: OCR A; font-size: small;"><span style="color: #000000;"> </span></span></span><span style="font-family: OCR A; color: #400080; font-size: small;"><span style="font-family: OCR A; color: #400080; font-size: small;"><span style="font-family: OCR A; color: #400080; font-size: small;">new</span></span></span><span style="font-family: OCR A; font-size: small;"><span style="font-family: OCR A; font-size: small;"><span style="color: #000000;"> </span></span></span><span style="font-family: OCR A; color: #305fb6; font-size: small;"><span style="font-family: OCR A; color: #305fb6; font-size: small;"><span style="font-family: OCR A; color: #305fb6; font-size: small;">CloudBlob</span></span></span><span style="font-family: OCR A; font-size: small;"><span style="font-family: OCR A; font-size: small;"><span style="color: #000000;">(</span></span></span><span style="font-family: OCR A; color: #010001; font-size: small;"><span style="font-family: OCR A; color: #010001; font-size: small;"><span style="font-family: OCR A; color: #010001; font-size: small;">item</span></span></span><span style="font-family: OCR A; color: #2e53d1; font-size: small;"><span style="font-family: OCR A; color: #2e53d1; font-size: small;"><span style="font-family: OCR A; color: #2e53d1; font-size: small;">.</span></span></span><span style="font-family: OCR A; color: #010001; font-size: small;"><span style="font-family: OCR A; color: #010001; font-size: small;"><span style="font-family: OCR A; color: #010001; font-size: small;">Uri</span></span></span><span style="font-family: OCR A; color: #2e53d1; font-size: small;"><span style="font-family: OCR A; color: #2e53d1; font-size: small;"><span style="font-family: OCR A; color: #2e53d1; font-size: small;">.</span></span></span><span style="font-family: OCR A; color: #010001; font-size: small;"><span style="font-family: OCR A; color: #010001; font-size: small;"><span style="font-family: OCR A; color: #010001; font-size: small;">AbsoluteUri</span></span></span><span style="font-family: OCR A; font-size: small;"><span style="font-family: OCR A; font-size: small;"><span style="color: #000000;">);<br /></span></span></span><span style="font-family: OCR A; color: #010001; font-size: small;"><span style="font-family: OCR A; color: #010001; font-size: small;"><span style="font-family: OCR A; color: #010001; font-size: small;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; blob</span></span></span><span style="font-family: OCR A; color: #2e53d1; font-size: small;"><span style="font-family: OCR A; color: #2e53d1; font-size: small;"><span style="font-family: OCR A; color: #2e53d1; font-size: small;">.</span></span></span><span style="font-family: OCR A; color: #010001; font-size: small;"><span style="font-family: OCR A; color: #010001; font-size: small;"><span style="font-family: OCR A; color: #010001; font-size: small;">Delete</span></span></span><span style="font-family: OCR A; font-size: small;"><span style="font-family: OCR A; font-size: small;"><span style="color: #000000;">();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;} <br />}</span></span></span></span></span></span></span></span></span></span></span></span></span></p>
<p>&nbsp;</p>
<p><span style="font-family: OCR A; color: #400080; font-size: small;"><span style="font-family: OCR A; color: #400080; font-size: small;"><span style="font-family: OCR A; color: #400080; font-size: small;">private</span></span></span><span style="font-family: OCR A; font-size: small;"><span style="font-family: OCR A; font-size: small;"> </span></span><span style="font-family: OCR A; color: #400080; font-size: small;"><span style="font-family: OCR A; color: #400080; font-size: small;"><span style="font-family: OCR A; color: #400080; font-size: small;">static</span></span></span><span style="font-family: OCR A; font-size: small;"><span style="font-family: OCR A; font-size: small;"> </span></span><span style="font-family: OCR A; color: #400080; font-size: small;"><span style="font-family: OCR A; color: #400080; font-size: small;"><span style="font-family: OCR A; color: #400080; font-size: small;">bool</span></span></span><span style="font-family: OCR A; font-size: small;"><span style="font-family: OCR A; font-size: small;"> </span></span><span style="font-family: OCR A; color: #010001; font-size: small;"><span style="font-family: OCR A; color: #010001; font-size: small;"><span style="font-family: OCR A; color: #010001; font-size: small;">ContainerExists</span></span></span><span style="font-family: OCR A; font-size: small;"><span style="font-family: OCR A; font-size: small;">(</span></span><span style="font-family: OCR A; color: #305fb6; font-size: small;"><span style="font-family: OCR A; color: #305fb6; font-size: small;"><span style="font-family: OCR A; color: #305fb6; font-size: small;">CloudBlobContainer</span></span></span><span style="font-family: OCR A; font-size: small;"><span style="font-family: OCR A; font-size: small;"> </span></span><span style="font-family: OCR A; color: #010001; font-size: small;"><span style="font-family: OCR A; color: #010001; font-size: small;"><span style="font-family: OCR A; color: #010001; font-size: small;">container</span></span></span><span style="font-family: OCR A; font-size: small;"><span style="font-family: OCR A; font-size: small;">)<br />{<br /></span></span><span style="font-family: OCR A; color: #400080; font-size: small;"><span style="font-family: OCR A; color: #400080; font-size: small;"><span style="font-family: OCR A; color: #400080; font-size: small;">&nbsp;&nbsp;&nbsp;&nbsp; bool</span></span></span><span style="font-family: OCR A; font-size: small;"><span style="font-family: OCR A; font-size: small;"> </span></span><span style="font-family: OCR A; color: #010001; font-size: small;"><span style="font-family: OCR A; color: #010001; font-size: small;"><span style="font-family: OCR A; color: #010001; font-size: small;">exist</span></span></span><span style="font-family: OCR A; font-size: small;"><span style="font-family: OCR A; font-size: small;"> </span></span><span style="font-family: OCR A; color: #2e53d1; font-size: small;"><span style="font-family: OCR A; color: #2e53d1; font-size: small;"><span style="font-family: OCR A; color: #2e53d1; font-size: small;">=</span></span></span><span style="font-family: OCR A; font-size: small;"><span style="font-family: OCR A; font-size: small;"> </span></span><span style="font-family: OCR A; color: #400080; font-size: small;"><span style="font-family: OCR A; color: #400080; font-size: small;"><span style="font-family: OCR A; color: #400080; font-size: small;">true</span></span></span><span style="font-family: OCR A; font-size: small;"><span style="font-family: OCR A; font-size: small;">;<br /></span></span><span style="font-family: OCR A; color: #400080; font-size: small;"><span style="font-family: OCR A; color: #400080; font-size: small;"><span style="font-family: OCR A; color: #400080; font-size: small;">&nbsp;&nbsp;&nbsp;&nbsp; try<br /></span></span></span><span style="font-family: OCR A; font-size: small;"><span style="font-family: OCR A; font-size: small;">&nbsp;&nbsp;&nbsp;&nbsp; {<br /></span></span><span style="font-family: OCR A; color: #010001; font-size: small;"><span style="font-family: OCR A; color: #010001; font-size: small;"><span style="font-family: OCR A; color: #010001; font-size: small;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; container</span></span></span><span style="font-family: OCR A; color: #2e53d1; font-size: small;"><span style="font-family: OCR A; color: #2e53d1; font-size: small;"><span style="font-family: OCR A; color: #2e53d1; font-size: small;">.</span></span></span><span style="font-family: OCR A; color: #010001; font-size: small;"><span style="font-family: OCR A; color: #010001; font-size: small;"><span style="font-family: OCR A; color: #010001; font-size: small;">FetchAttributes</span></span></span><span style="font-family: OCR A; font-size: small;"><span style="font-family: OCR A; font-size: small;">();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /></span></span><span style="font-family: OCR A; color: #400080; font-size: small;"><span style="font-family: OCR A; color: #400080; font-size: small;"><span style="font-family: OCR A; color: #400080; font-size: small;">&nbsp;&nbsp;&nbsp;&nbsp; catch</span></span></span><span style="font-family: OCR A; font-size: small;"><span style="font-family: OCR A; font-size: small;"> (</span></span><span style="font-family: OCR A; color: #305fb6; font-size: small;"><span style="font-family: OCR A; color: #305fb6; font-size: small;"><span style="font-family: OCR A; color: #305fb6; font-size: small;">StorageClientException</span></span></span><span style="font-family: OCR A; font-size: small;"><span style="font-family: OCR A; font-size: small;"> </span></span><span style="font-family: OCR A; color: #010001; font-size: small;"><span style="font-family: OCR A; color: #010001; font-size: small;"><span style="font-family: OCR A; color: #010001; font-size: small;">e</span></span></span><span style="font-family: OCR A; font-size: small;"><span style="font-family: OCR A; font-size: small;">)<br />&nbsp;&nbsp;&nbsp;&nbsp; {<br /></span></span><span style="font-family: OCR A; color: #400080; font-size: small;"><span style="font-family: OCR A; color: #400080; font-size: small;"><span style="font-family: OCR A; color: #400080; font-size: small;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if</span></span></span><span style="font-family: OCR A; font-size: small;"><span style="font-family: OCR A; font-size: small;"> (</span></span><span style="font-family: OCR A; color: #010001; font-size: small;"><span style="font-family: OCR A; color: #010001; font-size: small;"><span style="font-family: OCR A; color: #010001; font-size: small;">e</span></span></span><span style="font-family: OCR A; color: #2e53d1; font-size: small;"><span style="font-family: OCR A; color: #2e53d1; font-size: small;"><span style="font-family: OCR A; color: #2e53d1; font-size: small;">.</span></span></span><span style="font-family: OCR A; color: #010001; font-size: small;"><span style="font-family: OCR A; color: #010001; font-size: small;"><span style="font-family: OCR A; color: #010001; font-size: small;">ErrorCode</span></span></span><span style="font-family: OCR A; font-size: small;"><span style="font-family: OCR A; font-size: small;"> </span></span><span style="font-family: OCR A; color: #2e53d1; font-size: small;"><span style="font-family: OCR A; color: #2e53d1; font-size: small;"><span style="font-family: OCR A; color: #2e53d1; font-size: small;">!=</span></span></span><span style="font-family: OCR A; font-size: small;"><span style="font-family: OCR A; font-size: small;"> </span></span><span style="font-family: OCR A; color: #2b91af; font-size: small;"><span style="font-family: OCR A; color: #2b91af; font-size: small;"><span style="font-family: OCR A; color: #2b91af; font-size: small;">StorageErrorCode</span></span></span><span style="font-family: OCR A; color: #2e53d1; font-size: small;"><span style="font-family: OCR A; color: #2e53d1; font-size: small;"><span style="font-family: OCR A; color: #2e53d1; font-size: small;">.</span></span></span><span style="font-family: OCR A; color: #010001; font-size: small;"><span style="font-family: OCR A; color: #010001; font-size: small;"><span style="font-family: OCR A; color: #010001; font-size: small;">ResourceNotFound</span></span></span><span style="font-family: OCR A; font-size: small;"><span style="font-family: OCR A; font-size: small;">)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br /></span></span><span style="font-family: OCR A; color: #400080; font-size: small;"><span style="font-family: OCR A; color: #400080; font-size: small;"><span style="font-family: OCR A; color: #400080; font-size: small;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; throw</span></span></span><span style="font-family: OCR A; font-size: small;"><span style="font-family: OCR A; font-size: small;">;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /></span></span><span style="font-family: OCR A; color: #010001; font-size: small;"><span style="font-family: OCR A; color: #010001; font-size: small;"><span style="font-family: OCR A; color: #010001; font-size: small;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; exist</span></span></span><span style="font-family: OCR A; font-size: small;"><span style="font-family: OCR A; font-size: small;"> </span></span><span style="font-family: OCR A; color: #2e53d1; font-size: small;"><span style="font-family: OCR A; color: #2e53d1; font-size: small;"><span style="font-family: OCR A; color: #2e53d1; font-size: small;">=</span></span></span><span style="font-family: OCR A; font-size: small;"><span style="font-family: OCR A; font-size: small;"> </span></span><span style="font-family: OCR A; color: #400080; font-size: small;"><span style="font-family: OCR A; color: #400080; font-size: small;"><span style="font-family: OCR A; color: #400080; font-size: small;">false</span></span></span><span style="font-family: OCR A; font-size: small;"><span style="font-family: OCR A; font-size: small;">;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /></span></span><span style="font-family: OCR A; color: #400080; font-size: small;"><span style="font-family: OCR A; color: #400080; font-size: small;"><span style="font-family: OCR A; color: #400080; font-size: small;">&nbsp;&nbsp;&nbsp;&nbsp; return</span></span></span><span style="font-family: OCR A; font-size: small;"><span style="font-family: OCR A; font-size: small;"> </span></span><span style="font-family: OCR A; color: #010001; font-size: small;"><span style="font-family: OCR A; color: #010001; font-size: small;"><span style="font-family: OCR A; color: #010001; font-size: small;">exist</span></span></span><span style="font-family: OCR A; font-size: small;"><span style="font-family: OCR A; font-size: small;">;<br />}</span></span></p>
<p>Some more notes: while experimenting with high-throughput applications (applications that are uploading blobs at a high rate), I have found that the CreateIfNotExist() method is notoriously slow. How slow? Of the order of minutes. The ContainerExists method above is not faster either. It can take minutes for the FetchAttributes() call to return. Also read [this](<a href="https://social.msdn.microsoft.com/Forums/en/windowsazuredata/thread/8480223a-8cc7-4054-919c-a32ff02d5143">https://social.msdn.microsoft.com/Forums/en/windowsazuredata/thread/8480223a-8cc7-4054-919c-a32ff02d5143</a>) post that highlights concurrency issues with CreateIfNotExist(). Finally, if the container exists CreateIfNotExist() will cause a 409 in fiddler which appears highlighted in red and can lead you to think there is a bug in your code.&nbsp;</p>
<p><strong>Tips:</strong></p>
<ul>
<li>You don't need to add reference to Microsoft.WindowsAzure.ServiceRuntime.dll. The only reference I needed to add was to Microsoft.WindowsAzure.StorageClient.dll</li>
<li>If you do have a reference to Microsoft.WindowsAzure.ServiceRuntime.dll, RoleEnvironment.IsAvailable() tells whether you are running in an Azure environment or not.&nbsp;</li>
</ul>
<p>So we see its not that simple to write our first Hello World Azure app. </p>]]></content:encoded>
    </item>
    <item>
      <title>Dispose Lessons</title>
      <link>https://docs.microsoft.com/archive/blogs/siddjain/dispose-lessons</link>
      <pubDate>Wed, 14 Oct 2009 21:33:00 GMT</pubDate>
      <dc:creator><![CDATA[siddjain]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/siddjain/2009/10/14/dispose-lessons/</guid>
      <description><![CDATA[I recently read a number of excellent articles on Dispose. I will try to synthesise the practical...]]></description>
      <content:encoded><![CDATA[<P>I recently read a number of excellent articles on Dispose. I will try to synthesise the practical advice I learned here:</P>
<P>Q. What is Dispose, and when is it needed?<BR>A. Dispose is C#'s answer to deterministic resource deallocation. If your class owns unmanaged resources: 1. you must implement Dispose, 2. add a finalizer to the class 3. ensure the finalizer calls&nbsp;Dispose. If your class only owns managed resources, implementing Dispose is optional. If you don't implement it, you would be relying on the garbage collector to do the cleanup (indeterministic resource deallocation). If your class adds any event handlers, you should implement Dispose and unhook those event handlers in it, otherwise the handlers will keep instances of the class alive, and prevent&nbsp;garbage collection.</P>
<P>Q. How to implement Dispose?<BR>A: Case1: Your class does not own any&nbsp;unmanaged resources. In this case apply the basic pattern:</P><!-- code formatted by https://manoli.net/csharpformat/ -->
<STYLE type=text/css>
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: "OCR A Extended", Consolas, "Courier New", Courier, Monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}

.csharpcode pre { margin: 0em; }

.csharpcode .rem { color: #008000; }

.csharpcode .kwrd { color: #0000ff; }

.csharpcode .str { color: #006080; }

.csharpcode .op { color: #0000c0; }

.csharpcode .preproc { color: #cc6633; }

.csharpcode .asp { background-color: #ffff00; }

.csharpcode .html { color: #800000; }

.csharpcode .attr { color: #ff0000; }

.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}

.csharpcode .lnum { color: #606060; }
</STYLE>
<PRE class=csharpcode><SPAN class=kwrd>class</SPAN> MyDisposableClass : IDisposable
{
    <SPAN class=preproc>#region</SPAN> IDisposable Members

    <SPAN class=kwrd>public</SPAN> <SPAN class=kwrd>void</SPAN> Dispose()
    {
        Dispose(<SPAN class=kwrd>true</SPAN>);  <SPAN class=rem>// true to indicate that managed resources should be disposed</SPAN>
        GC.SuppressFinalize(<SPAN class=kwrd>this</SPAN>);  <SPAN class=rem>// already disposed off the resources, so there is no need to run finalizer</SPAN>
    }

    <SPAN class=preproc>#endregion</SPAN>

    <SPAN class=kwrd>protected</SPAN> <SPAN class=kwrd>virtual</SPAN> <SPAN class=kwrd>void</SPAN> Dispose(<SPAN class=kwrd>bool</SPAN> disposing)
    {
        <SPAN class=kwrd>if</SPAN> (disposing)
        {
            <SPAN class=rem>// dispose managed resources</SPAN>
        }
        <SPAN class=rem>// no unmanaged resources to dispose</SPAN>
    }
}</PRE>
<P>Notes:<BR>1. It would be much better to rename the disposing parameter as diposeManagedResources<BR>2. It may seem that use of disposing parameter is unnecessary, since we know beforehand that this class has only managed resources to dispose. But think about what happens when a class inherits from this class.</P>
<P>Case2: Your class owns unmanaged resources. In this case apply the full pattern:</P><!-- code formatted by https://manoli.net/csharpformat/ --><PRE class=csharpcode><SPAN class=kwrd>class</SPAN> foo : IDisposable
{
    <SPAN class=preproc>#region</SPAN> IDisposable Members

    <SPAN class=kwrd>public</SPAN> <SPAN class=kwrd>void</SPAN> Dispose()
    {
        Dispose(<SPAN class=kwrd>true</SPAN>);
        GC.SuppressFinalize(<SPAN class=kwrd>this</SPAN>);
    }

    <SPAN class=preproc>#endregion</SPAN>

    <SPAN class=kwrd>protected</SPAN> <SPAN class=kwrd>virtual</SPAN> <SPAN class=kwrd>void</SPAN> Dispose(<SPAN class=kwrd>bool</SPAN> disposeManagedResources)
    {
        <SPAN class=kwrd>if</SPAN> (disposeManagedResources)
        {
            <SPAN class=rem>// dispose managed resources</SPAN>
        }
        <SPAN class=rem>// dispose unmanaged resources</SPAN>
    }

    ~foo()
    {
        Dispose(<SPAN class=kwrd>false</SPAN>); <SPAN class=rem>// never touch managed resources on finalizer thread</SPAN>
    }
}</PRE>
<P>If your class inherits from a class that implements IDisposable properly, all you need to do is override the Dispose(bool) method and ensure that<BR>1. it calls the method on the base class (not necessary as per guidelines but I don't see any reason why this shouldn't be part of the guideline)<BR>2. it disposes off any additional resources consumed by your class<BR>Further, if your class owns unmanaged resources, but base class doesn't, then you would need to add a finalizer on your class.<BR>If base class owns unmanaged resources, it should have a finalizer on it, and your class should&nbsp;NOT add a finalizer. <BR><BR>Random Notes:<BR>1. The finalizer is run unpredictably by the Garbage collector (this is what we mean by indeterministic resource deallocation) on arbitrary thread<BR>2. The finalizer implicitly calls the base class finalizer. The above destructor method really translates to following:<BR></P><PRE class=csharpcode><SPAN class=kwrd>protected</SPAN> <SPAN class=kwrd>override</SPAN> <SPAN class=kwrd>void</SPAN> Finalize()
    {
        <SPAN class=kwrd>try</SPAN>
        {
            Dispose(<SPAN class=kwrd>false</SPAN>);
        }
        <SPAN class=kwrd>finally</SPAN>
        {
            <SPAN class=kwrd>base</SPAN>.Finalize();
        }
    }</PRE>
<P>3. If your class inherits from a class that has a finalizer on it, DO NOT write a&nbsp;finalizer on your class. <BR>4. The invocation of finalizer is not under your control.&nbsp;The finalizer&nbsp;is called by the Garbage Collector. <BR>5. It is your responsibility to have the finalizer call Dispose. The Garbage Collector&nbsp;does NOT call Dispose automatically.</P>
<P>Further Reading (I have chosen&nbsp;4 references from the many out there):<BR>- <A href="https://www.codeproject.com/KB/dotnet/idisposable.aspx" mce_href="https://www.codeproject.com/KB/dotnet/idisposable.aspx">https://www.codeproject.com/KB/dotnet/idisposable.aspx</A><BR>- <A href="https://msdn.microsoft.com/en-us/library/66x5fx1b(VS.80).aspx" mce_href="https://msdn.microsoft.com/en-us/library/66x5fx1b(VS.80).aspx">https://msdn.microsoft.com/en-us/library/66x5fx1b(VS.80).aspx</A><BR>- <A href="https://haacked.com/archive/2005/11/18/ACloserLookAtDisposePattern.aspx" mce_href="https://haacked.com/archive/2005/11/18/ACloserLookAtDisposePattern.aspx">https://haacked.com/archive/2005/11/18/ACloserLookAtDisposePattern.aspx</A><BR>- <A href="https://msdn.microsoft.com/en-us/library/0s71x931(VS.71).aspx">https://msdn.microsoft.com/en-us/library/0s71x931(VS.71).aspx</A></P>]]></content:encoded>
    </item>
    <item>
      <title>C# Quirks - finalizer is called if constructor throws an exception, but it is NOT called if method throws an exception</title>
      <link>https://docs.microsoft.com/archive/blogs/siddjain/c-quirks-finalizer-is-called-if-constructor-throws-an-exception-but-it-is-not-called-if-method-throws-an-exception</link>
      <pubDate>Mon, 12 Oct 2009 08:40:00 GMT</pubDate>
      <dc:creator><![CDATA[siddjain]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/siddjain/2009/10/12/c-quirks-finalizer-is-called-if-constructor-throws-an-exception-but-it-is-not-called-if-method-throws-an-exception/</guid>
      <description><![CDATA[Edit: Make sure to read the comment by Kevin Thompson
Test it out like this

    class Foo...]]></description>
      <content:encoded><![CDATA[<p>Edit: Make sure to read the comment by Kevin Thompson</p>
<p>Test it out like this</p>
<!-- code formatted by https://manoli.net/csharpformat/ -->
<pre class="csharpcode">    <span class="kwrd">class</span> Foo
    {
        <span class="kwrd">public</span> Foo(<span class="kwrd">bool</span> throwException)
        {
            <span class="kwrd">if</span> (throwException)
            {
                <span class="kwrd">throw</span> <span class="kwrd">new</span> InvalidOperationException();
            }
        }

        ~Foo() { Console.WriteLine(<span class="str">"destructor called"</span>); }

        <span class="kwrd">public</span> <span class="kwrd">void</span> Test() { <span class="kwrd">throw</span> <span class="kwrd">new</span> InvalidOperationException(); }
    }

<span class="kwrd">class</span> Program
    {
        <span class="kwrd">static</span> <span class="kwrd">void</span> Test1()
        {
            Console.WriteLine(<span class="str">"running Test1"</span>);
            Foo obj;
            <span class="kwrd">try</span>
            {
                obj = <span class="kwrd">new</span> Foo(<span class="kwrd">true</span>);    <span class="rem">// ctor will throw exception</span>
            }
            <span class="kwrd">catch</span>
            {
            }
            GC.Collect(); <span class="rem">// destructor will be called</span>
        }

        <span class="kwrd">static</span> <span class="kwrd">void</span> Test2()
        {
            Console.WriteLine(<span class="str">"running Test2"</span>);
            Foo obj = <span class="kwrd">new</span> Foo(<span class="kwrd">false</span>);    <span class="rem">// no exception in ctor</span>
            <span class="kwrd">try</span>
            {
                obj.Test();    <span class="rem">// exception in method</span>
            }
            <span class="kwrd">catch</span> { }
            GC.Collect();    <span class="rem">// destructor will NOT be called</span>
        }

        <span class="kwrd">static</span> <span class="kwrd">void</span> Main(<span class="kwrd">string</span>[] args)
        {
            <span class="rem">// Test1();</span>
            Test2();            
            Console.WriteLine(<span class="str">"done"</span>);
            Console.ReadLine();
        }
    }</pre>
<p>This makes sense, because if an exception occurs in the constructor, then this means the object has not been constructed. <br />Finally, remember that in C++, destructor is automatically called whenever an exception occurs</p>]]></content:encoded>
    </item>
  </channel>
</rss>