<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://blogs.msdn.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>!Dan Vallejo's WebLog!</title><link>http://blogs.msdn.com/danvallejo/default.aspx</link><description>Visual Studio .NET Developer</description><dc:language>en-US</dc:language><generator>CommunityServer 2.1 SP1 (Build: 61025.2)</generator><item><title>C# 2.0 Generic Interfaces</title><link>http://blogs.msdn.com/danvallejo/archive/2004/10/14/242518.aspx</link><pubDate>Thu, 14 Oct 2004 22:39:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:242518</guid><dc:creator>DanVallejo</dc:creator><slash:comments>5</slash:comments><comments>http://blogs.msdn.com/danvallejo/comments/242518.aspx</comments><wfw:commentRss>http://blogs.msdn.com/danvallejo/commentrss.aspx?PostID=242518</wfw:commentRss><description>&lt;p&gt;Just as in generic classes, it is useful to define generic interfaces. It's useful to define generic interfaces for collections such as linked lists.&lt;/p&gt; &lt;p&gt;In this example, we are defining a generic interface that requires T to be a reference type.&lt;/p&gt;&lt;pre class="code"&gt;// File: GenericInterfaces.cs&lt;br /&gt;using System;&lt;/pre&gt;&lt;pre class="code"&gt;public interface INode&amp;lt;T&amp;gt; where T:class&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; string Value&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; get;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; T Next&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; get;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;}&lt;/pre&gt;&lt;pre class="code"&gt;public class PersonNode : INode&amp;lt;PersonNode&amp;gt;&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; private string name;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; private PersonNode next;&lt;/pre&gt;&lt;pre class="code"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public PersonNode(string name, PersonNode next)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; this.name = name;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; this.next = next;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/pre&gt;&lt;pre class="code"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public string Value&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; get&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return name;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/pre&gt;&lt;pre class="code"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public PersonNode Next&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; get&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return next;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;}&lt;/pre&gt;&lt;pre class="code"&gt;public class Program&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; static void Main()&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; PersonNode danNode = new PersonNode("dan", null);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; PersonNode sabetNode = new PersonNode("sabet", danNode);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; PersonNode mikeNode = new PersonNode("mike", sabetNode);&lt;/pre&gt;&lt;pre class="code"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; PersonNode node = mikeNode;&lt;/pre&gt;&lt;pre class="code"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; while (node != null)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Console.WriteLine(node.Value);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; node = node.Next;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/pre&gt;&lt;pre class="code"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Console.ReadLine();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=242518" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/danvallejo/archive/tags/C_2300_/default.aspx">C#</category></item><item><title>C# 2.0 Constraints on Generic Types</title><link>http://blogs.msdn.com/danvallejo/archive/2004/10/14/242515.aspx</link><pubDate>Thu, 14 Oct 2004 22:38:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:242515</guid><dc:creator>DanVallejo</dc:creator><slash:comments>1</slash:comments><comments>http://blogs.msdn.com/danvallejo/comments/242515.aspx</comments><wfw:commentRss>http://blogs.msdn.com/danvallejo/commentrss.aspx?PostID=242515</wfw:commentRss><description>&lt;p&gt;You can also set up constraints on generic classes. What if you wanted to create a generic list of objects that derived from a certain base class? This would allow you call certain functions that existed in that class.&lt;/p&gt; &lt;p&gt;By constraining the type, you increase the number of functions you can perform on the type.&lt;/p&gt; &lt;p&gt;&lt;font face="Courier New"&gt;// File: Constraints.cs&lt;br /&gt;using System;&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font face="Courier New"&gt;public class Employee&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; private string name;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; private int id;&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font face="Courier New"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public Employee(string name, int id)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; this.name = name;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; this.id = id;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font face="Courier New"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public string Name&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; get &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; { &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return name; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; set &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; name = value; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public int Id&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; get &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return id; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; set &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; id = value; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font face="Courier New"&gt;}&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font face="Courier New"&gt;class MyList&amp;lt;T&amp;gt; where T : Employee&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; T[] list;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; int count;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public MyList()&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; list = new T[10];&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; count = 0;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font face="Courier New"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public void InsertSorted(T t)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; int index = 0;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; bool added = false;&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font face="Courier New"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; while (index &amp;lt; count)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (list[index].Id &amp;gt; t.Id)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; for (int last = count; last &amp;gt; index; last--)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; list[last] = list[last - 1];&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; list[index] = t;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; added = true;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; break;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; index++;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font face="Courier New"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (!added)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; list[index] = t;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; count++;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;}&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font face="Courier New"&gt;class Program&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; static void Main()&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; MyList&amp;lt;Employee&amp;gt; myList = new MyList&amp;lt;Employee&amp;gt;();&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font face="Courier New"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; myList.InsertSorted(new Employee("dan", 200));&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; myList.InsertSorted(new Employee("sabet", 100));&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; myList.InsertSorted(new Employee("mike", 150));&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; myList.InsertSorted(new Employee("richard", 120));&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;}&lt;br /&gt;&lt;/font&gt;&lt;/p&gt; &lt;p&gt; &lt;table id="Table1" cellspacing="1" cellpadding="1" width="100%" border="1"&gt; &lt;tbody&gt; &lt;tr&gt; &lt;td&gt;&lt;strong&gt;Constraint&lt;/strong&gt;&lt;/td&gt; &lt;td&gt;&lt;strong&gt;Description&lt;/strong&gt;&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td&gt;where T: &lt;em&gt;struct&lt;/em&gt;&lt;/td&gt; &lt;td&gt;The type argument must be a value type&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td&gt;where T: &lt;em&gt;class&lt;/em&gt;&lt;/td&gt; &lt;td&gt;The type argument must be a reference type&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td&gt;where T: &lt;em&gt;new( )&lt;/em&gt;&lt;/td&gt; &lt;td&gt;The type argument must have a public default constructor&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td&gt;where T: &amp;lt;base class name&amp;gt;&lt;/td&gt; &lt;td&gt;The type argument must be the base class name or derived from the base class name.&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td&gt;where T: &amp;lt;interface name&amp;gt;&lt;/td&gt; &lt;td&gt;The type argument must be the interface or implement the interface. Multiple interfaces may be specified.&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=242515" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/danvallejo/archive/tags/C_2300_/default.aspx">C#</category></item><item><title>C# 2.0 Generics</title><link>http://blogs.msdn.com/danvallejo/archive/2004/10/14/242513.aspx</link><pubDate>Thu, 14 Oct 2004 22:37:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:242513</guid><dc:creator>DanVallejo</dc:creator><slash:comments>2</slash:comments><comments>http://blogs.msdn.com/danvallejo/comments/242513.aspx</comments><wfw:commentRss>http://blogs.msdn.com/danvallejo/commentrss.aspx?PostID=242513</wfw:commentRss><description>&lt;p&gt;Visual Studio 2005 also introduces the next version of C#. C# 2.0 introduces generics, iterators, partial class definitions, nullable types, anonymous methods, the :: operator, static classes, accessor accessibility, fixed sized buffers (unsafe), friend assemblies, and #pragma warnings.&lt;/p&gt; &lt;p&gt;Generic types allow for the reuse of code and enhanced performance for collection classes (due to boxing and unboxing issues).&lt;/p&gt; &lt;p&gt;Generics are classes that are not type specific. For example, instead creating a Stack class for integers, another one for floats, you can create a generic class. The way this was done in the past was to create classes that just took objects. But, this lacks compile-time type checking. Everything is done at run-time.&lt;/p&gt;&lt;pre class="code"&gt;// File: StackObject.cs&lt;/pre&gt;&lt;pre class="code"&gt;using System;&lt;/pre&gt;&lt;pre class="code"&gt;class Stack&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; object[] stack;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; int top;&lt;/pre&gt;&lt;pre class="code"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public Stack(int size)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; stack = new object[size];&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; top = 0;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/pre&gt;&lt;pre class="code"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public object Pop()&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return stack[--top];&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/pre&gt;&lt;pre class="code"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public void Push(object v)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; stack[top++] = v;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;}&lt;/pre&gt;&lt;pre class="code"&gt;class Program&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; static void Main()&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Stack stack = new stack(10);&lt;/pre&gt;&lt;pre class="code"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Performance hit, boxing!!!&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; stack.Push(5);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; stack.Push(10);&lt;/pre&gt;&lt;pre class="code"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Another perf hit, unboxing!!!&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; int top = (int)stack.Pop();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt; &lt;p&gt;By using generics, you can eliminate the boxing and unboxing.&lt;/p&gt;&lt;pre class="codeheader"&gt;// File: StackGeneric.cs&lt;br /&gt;using System;&lt;/pre&gt;&lt;pre class="codeheader"&gt;class Stack&amp;lt;T&amp;gt;&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; T[] stack;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; int top;&lt;/pre&gt;&lt;pre class="codeheader"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public Stack(int size)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; stack = new T[size];&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; top = 0;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/pre&gt;&lt;pre class="codeheader"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public T Pop()&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return stack[--top];&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/pre&gt;&lt;pre class="codeheader"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public void Push(T v)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; stack[top++] = v;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;}&lt;/pre&gt;&lt;pre class="codeheader"&gt;class Program&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; static void Main()&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Stack&amp;lt;int&amp;gt; intStack = new Stack&amp;lt;int&amp;gt;(10);&lt;/pre&gt;&lt;pre class="codeheader"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; intStack.Push(5);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; intStack.Push(5);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; int top = intStack.Pop();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=242513" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/danvallejo/archive/tags/C_2300_/default.aspx">C#</category></item><item><title>Test Driven Development</title><link>http://blogs.msdn.com/danvallejo/archive/2004/10/14/242512.aspx</link><pubDate>Thu, 14 Oct 2004 22:35:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:242512</guid><dc:creator>DanVallejo</dc:creator><slash:comments>0</slash:comments><comments>http://blogs.msdn.com/danvallejo/comments/242512.aspx</comments><wfw:commentRss>http://blogs.msdn.com/danvallejo/commentrss.aspx?PostID=242512</wfw:commentRss><description>&lt;p&gt;If you go up to &lt;a href="http://www.msdn.com/express"&gt;http://www.msdn.com/express&lt;/a&gt; it takes you to the beta versions of the Express skus.&lt;/p&gt; &lt;p&gt;It has some cool features that help out in doing Test Driven development.&lt;/p&gt; &lt;p&gt;For example, when you have an open file of a project a refactor menu option shows up.&lt;/p&gt; &lt;p&gt;The Extract Method... option is used to extract out code from a function. Visual Studio will look at the variables used in the code block and create a new method based on the required data. Be careful to not include code that contains &lt;strong&gt;break&lt;/strong&gt; or &lt;strong&gt;continue&lt;/strong&gt; statements.&lt;/p&gt; &lt;p&gt;The Rename... option is used to rename all occurences of the selected variable/function/property/etc to a new name. The Preview Changes dialog shows you the changes that are about to be made. It also verifies the changes by compiling the code as well. All the code changes are highlighted. This ensures that existing code doesn't break.&lt;/p&gt; &lt;p&gt;The Encapsulate Field... option is used to convert a public field into a public property. Make sure the public field is lower-case before you do this. Otherwise, you will need to name the property something else.&lt;/p&gt; &lt;p&gt;The Extract Interface... option is used to create an interface based on public functions and properties. It will also mark the class as implementing the interface.&lt;/p&gt; &lt;p&gt;The Promote Local Variable to Parameter option is used to convert a local variable into a parameter. It will also change all calls to the function based on the assigned value of the local variable.&lt;/p&gt; &lt;p&gt;The Remove Parameters... will change all calls to the function to no longer pass the parameter.&lt;/p&gt; &lt;p&gt;The Reorder Parameters... will change all calls to the function to use the new ordering.&lt;/p&gt; &lt;p&gt;&lt;strong class="Note"&gt;Note&lt;/strong&gt;: The Refactor Menu only shows up when a project or solution is open.&lt;/p&gt; &lt;p&gt;I'll talk about C# 2.0 features next ...&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=242512" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/danvallejo/archive/tags/C_2300_/default.aspx">C#</category></item><item><title>Heads Down on Express Skus</title><link>http://blogs.msdn.com/danvallejo/archive/2004/07/30/202260.aspx</link><pubDate>Fri, 30 Jul 2004 15:45:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:202260</guid><dc:creator>DanVallejo</dc:creator><slash:comments>0</slash:comments><comments>http://blogs.msdn.com/danvallejo/comments/202260.aspx</comments><wfw:commentRss>http://blogs.msdn.com/danvallejo/commentrss.aspx?PostID=202260</wfw:commentRss><description>&lt;P&gt;I've been heads down investigating fixes for the Express skus.&lt;/P&gt;
&lt;P&gt;I want to thank everyone for their help in assisting me. I've emailed many of you to get more information.&lt;/P&gt;
&lt;P&gt;We are making changes to make the Express skus more robust when downloading the large packages. The changes have been based on the Watson data that has been sent in.&lt;/P&gt;
&lt;P&gt;We've been really exciting about the Watson data because it's the first time that we (the Setup team) have used it. And it is driving changes into the product based on your feedback.&lt;/P&gt;
&lt;P&gt;Please keep on sending more data!&lt;/P&gt;
&lt;P&gt;Thanks!&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=202260" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/danvallejo/archive/tags/C_2300_/default.aspx">C#</category></item><item><title>Express Download Failure Investigation</title><link>http://blogs.msdn.com/danvallejo/archive/2004/07/02/172175.aspx</link><pubDate>Fri, 02 Jul 2004 23:59:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:172175</guid><dc:creator>DanVallejo</dc:creator><slash:comments>14</slash:comments><comments>http://blogs.msdn.com/danvallejo/comments/172175.aspx</comments><wfw:commentRss>http://blogs.msdn.com/danvallejo/commentrss.aspx?PostID=172175</wfw:commentRss><description>&lt;P&gt;&lt;FONT face=Arial&gt;I'm currently investigating the source of the download failures for the Express skus.&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Arial&gt;Our number one problem is that we are seeing timeout problems. Unfortunately, that could be caused by many factors, including just Internet problems.&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Arial&gt;Please contact me. I will return every message posted to me.&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Arial&gt;Thanks!&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Arial&gt;-Dan Vallejo,&amp;nbsp;Setup Dev Team&lt;/FONT&gt;&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=172175" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/danvallejo/archive/tags/General/default.aspx">General</category><category domain="http://blogs.msdn.com/danvallejo/archive/tags/Microsoft/default.aspx">Microsoft</category><category domain="http://blogs.msdn.com/danvallejo/archive/tags/C_2300_/default.aspx">C#</category></item><item><title>Microsoft Visual C# 2005 Express Edition Beta Setup</title><link>http://blogs.msdn.com/danvallejo/archive/2004/07/02/171896.aspx</link><pubDate>Fri, 02 Jul 2004 16:01:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:171896</guid><dc:creator>DanVallejo</dc:creator><slash:comments>3</slash:comments><comments>http://blogs.msdn.com/danvallejo/comments/171896.aspx</comments><wfw:commentRss>http://blogs.msdn.com/danvallejo/commentrss.aspx?PostID=171896</wfw:commentRss><description>&lt;P&gt;&lt;FONT face=Arial&gt;We finally put the &lt;A href="http://msdn.microsoft.com/express"&gt;Express&lt;/A&gt; skus up on the web.&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Arial&gt;Our first attempt was on Wednesday at midnight. We've been working on making our setups downloadable. We use the BITS technology to download the files and then install them. One of the major reasons for using BITS is to facilitate the downloading of large files. In total, we download around 250 megs of data. And given how finicky the Internet is, it can easily fail. BITS is designed to help out. Our first problem is that we set our timeout values too low. We BITS gets a failure we wait for a maximum of 30 seconds. This, as we found out, is too small. Within a few hours of posting the Beta Express skus we got information back from Watson and user reports that timeouts were our biggest cause of failures.&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Arial&gt;We scrambled to figure out how to fix the problem. Which as it turned out was just tweaking a couple of constants.&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Arial&gt;So our second attempt went up sometime Wednesday night.&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Arial&gt;I installed the second version on Tuesday night from a private drop. BE PATIENT it may look hung but it's not. So when I started the installation, it downloaded all the packages. This takes a while. In fact, my install sat at 279091 K for about 10 minutes. I guess the new timeout values worked because it kept waiting and eventually continued.&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Arial&gt;I already have Visual Studio 2002 installed on my machine so after it installed the .NET Fx 2.0, it rebooted. Here's where the fun happened. After the reboot, it continued but it look hung. The installation progress bar was at 100% and all the packages where checkmarked. Also, all the packages where in alphabetical order. This is the bug. As long as the hard drive light is going, which mine was, it's fine. It will take another 30 minutes or so depending on your machine to finish installing the rest of the packages.&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Arial&gt;It worked on my machine!&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Arial&gt;Let me know if you have any questions.&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Arial&gt;--Dan&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Arial&gt;VS Setup Team&lt;/FONT&gt;&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=171896" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/danvallejo/archive/tags/General/default.aspx">General</category><category domain="http://blogs.msdn.com/danvallejo/archive/tags/Microsoft/default.aspx">Microsoft</category><category domain="http://blogs.msdn.com/danvallejo/archive/tags/C_2300_/default.aspx">C#</category></item><item><title>Serial Programming in Whidbey</title><link>http://blogs.msdn.com/danvallejo/archive/2004/05/25/141824.aspx</link><pubDate>Tue, 25 May 2004 23:24:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:141824</guid><dc:creator>DanVallejo</dc:creator><slash:comments>1</slash:comments><comments>http://blogs.msdn.com/danvallejo/comments/141824.aspx</comments><wfw:commentRss>http://blogs.msdn.com/danvallejo/commentrss.aspx?PostID=141824</wfw:commentRss><description>&lt;P&gt;&lt;FONT face=Arial&gt;I saw Brad's blog on &lt;A href="http://blogs.msdn.com/brada/archive/2004/02/13/72724.aspx"&gt;Serial Programming in Whidbey&lt;/A&gt;. It made me think about the days when I used to communicate with BBS's on a 2400 baud modem.&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Arial&gt;I saw one of the C# &lt;A href="http://www.gotdotnet.com/team/clr/bcl/demos/demos.aspx"&gt;serial demo projects&lt;/A&gt; required an LCD display from &lt;A href="http://www.crystalfontz.com"&gt;Crystalfontz&lt;/A&gt;.&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Arial&gt;I went ahead and ordered the 632 with 16x2 display.&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Arial&gt;Should be here soon...&lt;/FONT&gt;&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=141824" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/danvallejo/archive/tags/General/default.aspx">General</category></item><item><title>TechEd 2004 - San Diego</title><link>http://blogs.msdn.com/danvallejo/archive/2004/05/24/140880.aspx</link><pubDate>Tue, 25 May 2004 03:22:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:140880</guid><dc:creator>DanVallejo</dc:creator><slash:comments>3</slash:comments><comments>http://blogs.msdn.com/danvallejo/comments/140880.aspx</comments><wfw:commentRss>http://blogs.msdn.com/danvallejo/commentrss.aspx?PostID=140880</wfw:commentRss><description>&lt;P&gt;&lt;FONT face=Arial&gt;Balmer gave the keynote address to a packed crowd. He brought up the mission of doing more with less. Our industry along with education and healthcare have the chance to change people's lives. Everyone in our field has that opportunity. There are so many ways in which we can truly make a difference.&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Arial&gt;.NET is becoming more prevalent. Take a look at Visual Studio, Windows Server 2003, Longhorn, Office, Yukon (next version of SQL), and so on. The list of .NET compatible products is increasing. Microsoft is really making a big bet and a programming shift into .NET.&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Arial&gt;We're also betting on Visual Studio 2005 Team System (Burton). This is our end-to-end solution for developing a product. It will allow you to manage a product from specification, to bug tracking, to stress testing, and so on.&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Arial&gt;A lot of cool things are happening.&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Arial&gt;--Dan&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Arial&gt;I received this information by one of program managers, Kevin Morrill, attending the conference.&lt;/FONT&gt;&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=140880" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/danvallejo/archive/tags/General/default.aspx">General</category></item><item><title>Getting an Interface Object</title><link>http://blogs.msdn.com/danvallejo/archive/2004/05/22/139634.aspx</link><pubDate>Sat, 22 May 2004 23:34:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:139634</guid><dc:creator>DanVallejo</dc:creator><slash:comments>2</slash:comments><comments>http://blogs.msdn.com/danvallejo/comments/139634.aspx</comments><wfw:commentRss>http://blogs.msdn.com/danvallejo/commentrss.aspx?PostID=139634</wfw:commentRss><description>&lt;P&gt;&lt;FONT face=Arial&gt;You have several ways of getting an interface object.&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Arial&gt;The implicit way has the advantage in that the &lt;STRONG&gt;compiler&lt;/STRONG&gt; makes sure that the interface is implemented by the class. The disadvantage is that someone reading your code won't know that this is an interface being torn off. This just might need some more comments, that's it.&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Arial&gt;The explicit way has the advantage in that you have exactly called out the interface name. The problem is that you won't find out until runtime whether the code actually works or not. An exception will be thrown if the conversion is not able to take place.&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Arial&gt;The explicit way with the "as" has the advantage of being able to check if the interface is implemented similar to what was discussed above. Keep in mind that when you use the "as" method then you &lt;STRONG&gt;should&lt;/STRONG&gt; be checking for null.&lt;/FONT&gt;&lt;/P&gt;&lt;PRE class=code&gt;static void Main()
{
    Tester    tst = new Tester();
    IReader  reader;&lt;/PRE&gt;&lt;PRE class=code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; // implicit compile-time conversion&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; reader = tst; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; // explicit run-time conversion with exception&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; reader = (IReader)tst;&lt;/PRE&gt;&lt;PRE class=code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; // explicit run-time conversion with null&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; reader = tst as IReader;&lt;BR&gt;}&lt;BR&gt;&lt;/PRE&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=139634" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/danvallejo/archive/tags/C_2300_/default.aspx">C#</category></item><item><title>Creating Datatips for Debugging Your Classes</title><link>http://blogs.msdn.com/danvallejo/archive/2004/05/22/139632.aspx</link><pubDate>Sat, 22 May 2004 23:29:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:139632</guid><dc:creator>DanVallejo</dc:creator><slash:comments>0</slash:comments><comments>http://blogs.msdn.com/danvallejo/comments/139632.aspx</comments><wfw:commentRss>http://blogs.msdn.com/danvallejo/commentrss.aspx?PostID=139632</wfw:commentRss><description>&lt;P&gt;&lt;FONT face=Arial&gt;How do you display the contents of your custom classes. When you hover over a variable in the debugger, it shows you the contents of the variable. How do&amp;nbsp;you do that for your own classes?&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Arial&gt;In the directory &lt;/FONT&gt;&lt;A href="file:///C:/Program%20Files/Microsoft%20Visual%20Studio%20.NET/Common7/Packages/Debugger"&gt;&lt;FONT face=Arial&gt;C:\Program Files\Microsoft Visual Studio .NET 2003\Common7\Packages\Debugger&lt;/FONT&gt;&lt;/A&gt;&lt;FONT face=Arial&gt;, there is a file named &lt;STRONG&gt;mcee_cs.dat&lt;/STRONG&gt; that contains the various definitions for how they should display in the debugger.&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Arial&gt;Add the following line to the mcee_cs.dat file:&lt;/FONT&gt;&lt;/P&gt;&lt;PRE class=code&gt;&amp;lt;yourNameSpace.yourClassName&amp;gt;=V1=&amp;lt;memberVar1&amp;gt; V2=&amp;lt;memberVar2&amp;gt;&lt;/PRE&gt;
&lt;P&gt;&lt;FONT face=Arial&gt;You'll first need to shut down Visual Studio and then when you debug the program you can hover over the custom classes and see their contents.&lt;/FONT&gt;&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=139632" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/danvallejo/archive/tags/C_2300_/default.aspx">C#</category></item><item><title>Events versus Delegates</title><link>http://blogs.msdn.com/danvallejo/archive/2004/05/22/139616.aspx</link><pubDate>Sat, 22 May 2004 22:16:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:139616</guid><dc:creator>DanVallejo</dc:creator><slash:comments>5</slash:comments><comments>http://blogs.msdn.com/danvallejo/comments/139616.aspx</comments><wfw:commentRss>http://blogs.msdn.com/danvallejo/commentrss.aspx?PostID=139616</wfw:commentRss><description>&lt;P&gt;&lt;FONT face=Arial&gt;So what is the difference between &lt;STRONG&gt;event&lt;/STRONG&gt;s and &lt;STRONG&gt;delegate&lt;/STRONG&gt;s? The reality is that currently they are basically the same. The difference is that the += operator that is used to add a delegate function to an &lt;STRONG&gt;event&lt;/STRONG&gt; is thread-safe whereas when using a &lt;STRONG&gt;delegate&lt;/STRONG&gt; the += operator is not thread-safe.&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Arial&gt;&lt;STRONG&gt;event&lt;/STRONG&gt;s have always been multi-cast, meaning that an event might call multiple functions. In the beta version of&amp;nbsp;.NET &lt;STRONG&gt;delegate&lt;/STRONG&gt;s where single-cast meaning that only a single &lt;STRONG&gt;delegate&lt;/STRONG&gt; function would be called. But in the RTM version of .NET 1.0, &lt;STRONG&gt;delegate&lt;/STRONG&gt;s were made multi-cast.&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Arial&gt;If you look at the MSIL you'll see more differences. But in general, you can simply remove the &lt;STRONG&gt;event&lt;/STRONG&gt; keyword and your program for the most part will work the same as it did.&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Arial&gt;The main usefulness that I see is that it indicates to the user what your intentions are. A &lt;STRONG&gt;delegate&lt;/STRONG&gt; is simply a function pointer that can be used to call custom code such as passing in the comparison function. An &lt;STRONG&gt;event&lt;/STRONG&gt; is used to notify the user that a special event has happened such as new mail has arrived.&lt;/FONT&gt;&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=139616" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/danvallejo/archive/tags/C_2300_/default.aspx">C#</category></item><item><title>Implementing Properties on an Interface</title><link>http://blogs.msdn.com/danvallejo/archive/2004/05/22/139599.aspx</link><pubDate>Sat, 22 May 2004 21:06:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:139599</guid><dc:creator>DanVallejo</dc:creator><slash:comments>2</slash:comments><comments>http://blogs.msdn.com/danvallejo/comments/139599.aspx</comments><wfw:commentRss>http://blogs.msdn.com/danvallejo/commentrss.aspx?PostID=139599</wfw:commentRss><description>&lt;P&gt;&lt;FONT face=Arial&gt;When you implement an interface that has a property. You would think that you wouldn't be able to add additional accessors. Given the IDisplay interface below then class should only be allowed to implement the set accessor. But in reality since properties really resolve down to just functions, all you are really doing is just adding another function to your class.&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Arial&gt;So you can actually implement the interface property with both the get and set accessor even though the propery is only supposed to have the set accessor.&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;interface IDisplay&lt;BR&gt;{&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; string Message&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; set;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;}&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;BR&gt;class Shape : IDisplay&lt;BR&gt;{&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public string Message&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; get // not part of the interface&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return msg;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; set&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; msg = value;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;}&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Arial&gt;&lt;FONT color=#ff0000&gt;&lt;STRONG&gt;Note&lt;/STRONG&gt;&lt;/FONT&gt;: That this ONLY works when you use public interface implementation if you switch this to explicit interface implementation then you get a compiler error.&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New"&gt;class Shape : IDisplay&lt;BR&gt;{&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; string IDisplay.Message&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; get // syntax error&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return msg;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; set&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; msg = value;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;}&lt;/FONT&gt;&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=139599" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/danvallejo/archive/tags/C_2300_/default.aspx">C#</category></item><item><title>Explicit Implementation of Multiple Interfaces</title><link>http://blogs.msdn.com/danvallejo/archive/2004/05/22/139596.aspx</link><pubDate>Sat, 22 May 2004 20:57:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:139596</guid><dc:creator>DanVallejo</dc:creator><slash:comments>0</slash:comments><comments>http://blogs.msdn.com/danvallejo/comments/139596.aspx</comments><wfw:commentRss>http://blogs.msdn.com/danvallejo/commentrss.aspx?PostID=139596</wfw:commentRss><description>&lt;P&gt;&lt;FONT face=Arial&gt;If you have interfaces derived from other interfaces it makes explicit implementation of them a little funny in the class.&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Arial&gt;Notice that in the following code (class TestBar) when you implement IBar that you need to use IFoo even though the class only indicates that it's implementing IBar.&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New"&gt;interface IFoo&lt;BR&gt;{&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; void Draw();&lt;BR&gt;}&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New"&gt;interface IBar : IFoo&lt;BR&gt;{&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; void GetString();&lt;BR&gt;}&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;BR&gt;&lt;/FONT&gt;&lt;FONT face="Courier New"&gt;class TestBar : IBar&lt;BR&gt;{&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; void IFoo.Draw()&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; void IBar.GetString()&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;}&lt;/FONT&gt;&lt;BR&gt;&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=139596" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/danvallejo/archive/tags/C_2300_/default.aspx">C#</category></item><item><title>Creating Charts in ASP.NET</title><link>http://blogs.msdn.com/danvallejo/archive/2003/08/04/51947.aspx</link><pubDate>Mon, 04 Aug 2003 22:51:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:51947</guid><dc:creator>DanVallejo</dc:creator><slash:comments>3</slash:comments><comments>http://blogs.msdn.com/danvallejo/comments/51947.aspx</comments><wfw:commentRss>http://blogs.msdn.com/danvallejo/commentrss.aspx?PostID=51947</wfw:commentRss><description>&lt;body xmlns="http://www.w3.org/1999/xhtml"&gt;
    &lt;p&gt;
        I finished my first pass at the Advanced ASP.NET course. 
    &lt;/p&gt;
    &lt;p&gt;
        Here's a snippet of my section on graphics... 
    &lt;/p&gt;
    &lt;ol&gt;
        &lt;li&gt;
            &lt;p&gt;
                Add a new web form named Chart.aspx. 
            &lt;/p&gt;
        &lt;/li&gt;
        &lt;li&gt;
            &lt;p&gt;
                Modify Page_Load as follows: 
            &lt;/p&gt;
            &lt;pre class="code"&gt;private void Page_Load(object sender, System.EventArgs e)
{
    Random r = new Random();

    // A. Create a bitmap object
    Bitmap bmp = new Bitmap(250,150);

    // B. Create a graphics object to draw on
    // based on the bitmap.
    Graphics g = Graphics.FromImage(bmp);

    // C. Draw on the graphics object
    g.FillRectangle(new SolidBrush(Color.Beige), 0,0, bmp.Width, bmp.Height);

    SolidBrush b = new SolidBrush(Color.Navy);
    Font f = new Font("Arial", 14);
    Font legend = new Font("Arial", 6);

    for (int x = 0; x &amp;lt; 10; x++)
    {
        int h = r.Next(1,100);

        // rectangles fill upside down
        g.FillRectangle(b, x*20, bmp.Height - h - 10, 15, h);

        g.DrawString((x+1).ToString(), legend, b, x*20, bmp.Height - 10);
    }

    g.DrawString("Hello World", f, new SolidBrush(Color.Red), 10, 10);

    // D. Save the bitmap to the response outputstream
    bmp.Save(Response.OutputStream, System.Drawing.Imaging.ImageFormat.Gif);

    // E. Dispose of the objects
    g.Dispose();
    bmp.Dispose();
}&lt;/pre&gt;
        &lt;/li&gt;
        &lt;li&gt;
            Press F5 and navigate to the Chart.aspx page 
        &lt;/li&gt;
    &lt;/ol&gt;
    &lt;p&gt;
        Now how do you include the chart in another page?
    &lt;/p&gt;
    &lt;ol&gt;
        &lt;li&gt;
            &lt;p&gt;
                Open Default.aspx and drag an Image control on the bottom of the page.
            &lt;/p&gt;
        &lt;/li&gt;
        &lt;li&gt;
            &lt;p&gt;
                Modify the ImageUrl property to Chart.aspx.
            &lt;/p&gt;
        &lt;/li&gt;
        &lt;li&gt;
            &lt;p&gt;
                Press F5.
            &lt;/p&gt;
        &lt;/li&gt;
    &lt;/ol&gt;
    &lt;p&gt;
        Pretty cool!
    &lt;/p&gt;
&lt;/body&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=51947" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/danvallejo/archive/tags/ASP.NET/default.aspx">ASP.NET</category></item></channel></rss>