<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>C#</title><link>http://blogs.interknowlogy.com/adamcalderon/category/7.aspx</link><description>Interesting tidbids that cover C#</description><dc:language>en-US</dc:language><generator>.Text Version 0.95.2004.111</generator><item><dc:creator>Adam Calderon</dc:creator><title>Enumeration (Enum) Gotcha</title><link>http://blogs.interknowlogy.com/adamcalderon/archive/2006/08/08/3705.aspx</link><pubDate>Tue, 08 Aug 2006 22:59:00 GMT</pubDate><guid>http://blogs.interknowlogy.com/adamcalderon/archive/2006/08/08/3705.aspx</guid><description>&lt;p&gt;Enumerations can make your&amp;nbsp;code much easier to read but there is one thing you should&amp;nbsp;watch out for when using them. Before I get into what to&amp;nbsp;watch out for let me define what an enumeration is. An enum type is a distinct value type with a set of named constants. An enum type that does not explicitly declare an underlying type has a type of int. So this means that by default an enum can have&amp;nbsp;a range of values (constants)&amp;nbsp;equivalent to an int. The set of values that an enum type can take on is not limited by the enum members. In fact any value of the underlying type of an enum can be cast to the enum type and is a distinct valid value of that enum type. These last statements are the basis for a&amp;nbsp;Gotcha you need to watch out for when using enumerations.&lt;/p&gt;
&lt;p&gt;The fact that an enum can be any valid type of the underlying type allows things like this to happen.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;// Variable is created and assigned a value of ProductType.Commercial&lt;br /&gt;&amp;nbsp;ProductType productType = ProductType.Commercial;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;// Variable is assigned a new value that is out of range&lt;br /&gt;&amp;nbsp;productType = (ProductType)100;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;You need to keep this in mind when creating methods and properties&amp;nbsp;that accept enumerations. Sure most of us use Visual Studio to create our applications and most of us would use the enum type instead of doing something odd like above but the fact you can do it can lead to some interesting results in your application. Here is an example of a method that doesn&amp;rsquo;t check for valid values.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /// &amp;lt;summary&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /// This method accepts a ProductType enum as a parameter and throws an exception if the &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /// value is out of range.&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /// &amp;lt;/summary&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /// &amp;lt;param name="type"&amp;gt;A valid ProductType enumeration&amp;lt;/param&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; static void AcceptProductType(ProductType type)&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; // The switch will not blow up if the value is not in range&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; switch (type)&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; case ProductType.HouseHold:&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; Console.WriteLine("AcceptProductType Message: This is an enum with a value of " + type.ToString());&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; 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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; case ProductType.Commercial:&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; Console.WriteLine("AcceptProductType Message: This is an enum with a value of " + type.ToString());&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; 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; }&lt;/p&gt;
&lt;p&gt;As you can see without checking the parameter this switch statement would never do anything if an invalid value was passed in. This could be resolved by using a default statement in the switch and throwing an exception but&amp;nbsp;that could get messy if the method only worked with a few values of the enum. A better approach would be to check the parameter and throw an exception right at the top of the method like the following method.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /// &amp;lt;summary&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /// This method accepts a ProductType enumeration and validates that the parameter is&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /// of type ProductType&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /// &amp;lt;/summary&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /// &amp;lt;param name="type"&amp;gt;A valid ProductType enumeration&amp;lt;/param&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; static void AcceptProductTypeRevised(ProductType type)&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; // Check the parameter to see if the value is correct&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 (Enum.IsDefined(typeof(ProductType), type) == false)&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; throw new ArgumentOutOfRangeException("This value is not in the range for the enum type ProductType");&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; &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; // Do some work&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; AcceptProductType(type);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;This approach identifies the issue right away and never lets the method execute if the parameter is incorrect. This type of defensive programming can save a lot of time when it comes to testing your code. I have included a sample console application that demonstrates this. &lt;/p&gt;
&lt;p&gt;&lt;a href="http://blogs.interknowlogy.com/downloads/adamcalderon/EnumSample.zip"&gt;EnumSample.zip (16 KB)&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;img src ="http://blogs.interknowlogy.com/adamcalderon/aggbug/3705.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>Adam Calderon</dc:creator><title>Slides and Code from the C# New Features Presentation at the .NET Developers User Group last Tuesday</title><link>http://blogs.interknowlogy.com/adamcalderon/archive/2006/08/07/3671.aspx</link><pubDate>Mon, 07 Aug 2006 11:22:00 GMT</pubDate><guid>http://blogs.interknowlogy.com/adamcalderon/archive/2006/08/07/3671.aspx</guid><description>&lt;p&gt;Here are the slides and sample code from the presentation on C# I did at the .NET Developers Users Group last Tuesday.&lt;/p&gt;
&lt;p&gt;&lt;A href="http://blogs.interknowlogy.com/downloads/adamcalderon/Advanced_20Introduction_20to_20C_23.ppt"&gt;Advanced Introduction to C#.ppt&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;A href="http://blogs.interknowlogy.com/downloads/adamcalderon/CSharpIntroDemo.zip"&gt;CSharpIntroDemo.zip&lt;/a&gt;&lt;/p&gt;&lt;img src ="http://blogs.interknowlogy.com/adamcalderon/aggbug/3671.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>Adam Calderon</dc:creator><title>Debugger Attributes</title><link>http://blogs.interknowlogy.com/adamcalderon/archive/2006/08/03/3612.aspx</link><pubDate>Thu, 03 Aug 2006 16:54:00 GMT</pubDate><guid>http://blogs.interknowlogy.com/adamcalderon/archive/2006/08/03/3612.aspx</guid><description>&lt;p&gt;When debugging applications sometimes it&amp;rsquo;s really nice to be able to tweak things a little. Say you are stepping through segments of&amp;nbsp;your&amp;nbsp;code&amp;nbsp;time and time again and you are tired of stepping into the&amp;nbsp;property getters of&amp;nbsp;your class&amp;nbsp;as you pass a property as a parameter into a method. Or how about when you are using the new debugger visualizers and would love to see some highlights of your custom class without having to click the + sign. In the System.Diagnostic namespace are a few real handy attributes that can make your life easier when debugging.&lt;/p&gt;
&lt;p&gt;First&amp;nbsp;is the &lt;a href="http://msdn2.microsoft.com/en-us/library/system.diagnostics.debuggerstepthroughattribute.aspx"&gt;DebuggerStepThrough Attribute&lt;/a&gt;&amp;nbsp;which stops the debugger from stepping into a class, constructor or method (to name a few). If you decorate your property getter when you F11 into a property you will no longer step into your getter code. Below is an example of applying this attribute.&lt;font size="2"&gt;&amp;nbsp;&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; public string Address&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; //this attribute stops you from going into the address getter&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; [DebuggerStepThrough()]&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; get { return address; }&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; set { address = value; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; /// &amp;lt;summary&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; /// This class uses the DebuggerStepThrough attribute to stop the debugger&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; /// from entering any of the properties getters or setters.&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; /// &amp;lt;/summary&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; [DebuggerStepThrough()]&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; class Customer2&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;&amp;nbsp; &amp;nbsp;...code goes here&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;
&lt;p&gt;Next is the &lt;a href="http://msdn2.microsoft.com/en-us/library/system.diagnostics.debuggerdisplayattribute.aspx"&gt;DebuggerDisplay Attribute&lt;/a&gt;&amp;nbsp;(which is new to .NET 2.0) and is used to display information to the debugger visualizer. The&amp;nbsp;constructor of this attribute&amp;nbsp;accepts a string which is displayed in the value column for instances of the type in either the locals window or the visualizer. The string can contain braces ({ and }) and the text within a pair of braces is evaluated as the name of a field, property, or method. Below is an example of applying this attribute.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /// &amp;lt;summary&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; /// This class uses the DebuggerDisplay attribute to show highlights of information&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; /// stored in the class. This information is displayed in the debugger visualizers&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; /// and in the locals window.&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; /// &amp;lt;/summary&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; [DebuggerDisplay("FirstName={firstName},LastName={lastName}")]&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; class Customer3&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; #region Members&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; private string firstName;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; private string lastName;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; private string phone;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; private string address;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; #endregion&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; #region Properties&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; public string Address&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; get { return address; }&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; set { address = value; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; public string Phone&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; get { return phone; }&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; set { phone = value; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; public string LastName&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; get { return lastName; }&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; set { lastName = value; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; public string FirstName&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; get { return firstName; }&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; set { firstName = value; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; #endregion&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;}&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;In the editor the attribute changes the default behavior of the visualizer (see below)&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;img alt="Visualizer1" src="http://blogs.interknowlogy.com/downloads/adamcalderon/Visualizer1_small.jpg" border="0" /&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;and in the locals window the attribute changes the value entry (see below).&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;img alt="Locals" src="http://blogs.interknowlogy.com/downloads/adamcalderon/Locals_small.jpg" border="0" /&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;Finally there is one more attribute that can come in handy when you are using third-party code. The &lt;a href="http://msdn2.microsoft.com/en-us/library/system.diagnostics.debuggernonusercodeattribute.aspx"&gt;DebuggerNonUserCode Attribute&lt;/a&gt; is used to both hide the values from the debugger (similar to the &lt;a href="http://msdn2.microsoft.com/en-us/library/system.diagnostics.debuggerhiddenattribute.aspx"&gt;DebuggerHidden Attribute&lt;/a&gt;) and stop the debugger from stepping into the code (similar to &lt;a href="http://msdn2.microsoft.com/en-us/library/system.diagnostics.debuggerstepthroughattribute.aspx"&gt;DebuggerStepThrough Attribute&lt;/a&gt;). This attribute can be applied a class, constructor, method or property.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;Here is a sample project that you can use to see how these attributes work.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://blogs.interknowlogy.com/downloads/adamcalderon/DebugAttributesDemo.zip"&gt;DebugAttributesDemo.zip&lt;/a&gt;&lt;a href="http://blogs.interknowlogy.com/downloads/adamcalderon/DebugAttributesDemo.zip"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;/font&gt;&lt;/font&gt;&lt;img src ="http://blogs.interknowlogy.com/adamcalderon/aggbug/3612.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>Adam Calderon</dc:creator><title>Code Camp Content</title><link>http://blogs.interknowlogy.com/adamcalderon/archive/2006/01/23/814.aspx</link><pubDate>Mon, 23 Jan 2006 06:23:00 GMT</pubDate><guid>http://blogs.interknowlogy.com/adamcalderon/archive/2006/01/23/814.aspx</guid><description>&lt;p&gt;For those of you at my C# session the sample console application contains all of the Generics, Iterator and Property Accessor code. I recommend going through the code and changing things around to get a better feel for how the technology works. The WinForms application I showed with the Anonymous methods is also included.&lt;/p&gt;
&lt;p&gt;&lt;A href="http://blogs.interknowlogy.com/downloads/adamcalderon/IntroCSharpDemo.zip"&gt;Introduction to C# Slides and Demo Code&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;For those of you in my WinForms session I have included the sample code for everything we talked about. The object based application we went over in detail is the OrderEntryDemo application. This application is a great one to add more and more functionality to. One of the attendees was asking about editing a collection of data in a grid. Connecting the Order class to a grid, since it&amp;#8217;s based on BindingList&lt;T&gt; would be an excellent project to take on.&lt;/p&gt;
&lt;p&gt;&lt;A href="http://blogs.interknowlogy.com/downloads/adamcalderon/IntroWinFormsDemo.zip"&gt;Introduction to Winforms Slides and Demo Code&lt;/a&gt;&lt;/p&gt;&lt;img src ="http://blogs.interknowlogy.com/adamcalderon/aggbug/814.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>Adam Calderon</dc:creator><title>BindingList&lt;T&gt; a new way to bind lists</title><link>http://blogs.interknowlogy.com/adamcalderon/archive/2006/01/16/796.aspx</link><pubDate>Mon, 16 Jan 2006 19:10:00 GMT</pubDate><guid>http://blogs.interknowlogy.com/adamcalderon/archive/2006/01/16/796.aspx</guid><description>&lt;p&gt;In .NET 1.1 binding to a list required a lot of work. First you had to inherit from Collection base and implement all of the Collection interfaces so that the caller could add and remove and move through your collection in a type safe way. Then you had to implement IBindingList which afforded your list the ability to keep up to data as a user edited your collection when bound to a grid. When all of this was said and done you had quite a bit of work to do.&lt;/p&gt;
&lt;p&gt;public class CustomersList :  CollectionBase, IBindingList&lt;br /&gt;{&lt;br /&gt;    // all of the implementation went here&lt;/p&gt;
&lt;p&gt;}&lt;/p&gt;
&lt;p&gt;Now in .NET 2.0 this work has been dramatically reduced. A new class BindingList&lt;T&gt; has been added that inherits from Collection&lt;T&gt; and implements IBindingList, IList, ICollection, IEnumerable, ICancelAddNew, IRaiseItemChangedEvents. By having all of this wrapped up for you creating a list of cutomers you can bind to is a simple as:&lt;/p&gt;
&lt;p&gt;BindingList&lt;Customer&gt; customerCollection = new BindingList&lt;Customer&gt;();&lt;/p&gt;
&lt;p&gt;This statement performs what one took many many lines of code. The customerCollection variable can now be bound to a grid and work with in row editing and all of the new features of the DataGridVeiw. Now there are still a few things left to do. First you have to add data to the collection (of course) but one other thing is to have the Customer class implement INotifiyPropertyChanged and IEditableObject. The IEditableObject is the same as before but the INotifyPropertyChanged interface implements a pattern that was originally accomplished by adding a XXXPropertyChanged event for each property in your class. The code below demonstrates the changes. As you can see removing the need for the many XXXPropertyChanged events saves a lot of coding.&lt;/p&gt;
&lt;p&gt;  public class Customer : IEditableObject, INotifyPropertyChanged&lt;br /&gt;    {&lt;br /&gt;        private bool editMode = false;&lt;br /&gt;        &lt;br /&gt;        private int number;&lt;br /&gt;        private int _number;&lt;/p&gt;
&lt;p&gt;        public int Number&lt;br /&gt;        {&lt;br /&gt;            get { return number; }&lt;br /&gt;            set { number = value; OnPropertyChanged("Number"); }&lt;br /&gt;        }&lt;/p&gt;
&lt;p&gt;        private string name;&lt;br /&gt;        private string _name;&lt;/p&gt;
&lt;p&gt;        public string Name&lt;br /&gt;        {&lt;br /&gt;            get { return name; }&lt;br /&gt;            set { name = value; OnPropertyChanged("Name"); }&lt;br /&gt;        }&lt;/p&gt;
&lt;p&gt;        private string street;&lt;br /&gt;        private string _street;&lt;/p&gt;
&lt;p&gt;        public string Street&lt;br /&gt;        {&lt;br /&gt;            get { return street; }&lt;br /&gt;            set { street = value; OnPropertyChanged("Street"); }&lt;br /&gt;        }&lt;/p&gt;
&lt;p&gt;        private string city;&lt;br /&gt;        private string _city;&lt;/p&gt;
&lt;p&gt;        public string City&lt;br /&gt;        {&lt;br /&gt;            get { return city; }&lt;br /&gt;            set { city = value; OnPropertyChanged("Street"); }&lt;br /&gt;        }&lt;/p&gt;
&lt;p&gt;        private string state;&lt;br /&gt;        private string _state;&lt;/p&gt;
&lt;p&gt;        public string State&lt;br /&gt;        {&lt;br /&gt;            get { return state; }&lt;br /&gt;            set { state = value; OnPropertyChanged("State"); }&lt;br /&gt;        }&lt;/p&gt;
&lt;p&gt;        public Customer() { }&lt;br /&gt;        &lt;br /&gt;        public Customer(int number, string name, string street, string city, string state)&lt;br /&gt;        {&lt;br /&gt;            this.number = number;&lt;br /&gt;            this._number = number;&lt;br /&gt;            this.name = name;&lt;br /&gt;            this._name = name;&lt;br /&gt;            this.street = street;&lt;br /&gt;            this._street = street;&lt;br /&gt;            this.city = city;&lt;br /&gt;            this._city = city;&lt;br /&gt;            this.state = state;&lt;br /&gt;            this._state = state;&lt;br /&gt;        }&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt;        #region IEditableObject Members&lt;/p&gt;
&lt;p&gt;        public void BeginEdit()&lt;br /&gt;        {&lt;br /&gt;            if (!editMode)&lt;br /&gt;            {&lt;br /&gt;                _number = number;&lt;br /&gt;                _name = name;&lt;br /&gt;                _street = street;&lt;br /&gt;                _city = city;&lt;br /&gt;                _state = state;&lt;br /&gt;            }&lt;/p&gt;
&lt;p&gt;            editMode = true;&lt;br /&gt;        }&lt;/p&gt;
&lt;p&gt;        public void CancelEdit()&lt;br /&gt;        {&lt;br /&gt;            if (editMode)&lt;br /&gt;            {&lt;br /&gt;                number = _number;&lt;br /&gt;                name = _name;&lt;br /&gt;                street = _street;&lt;br /&gt;                city = _city;&lt;br /&gt;                state = _state;&lt;br /&gt;            }&lt;br /&gt;            editMode = false;&lt;br /&gt;        }&lt;/p&gt;
&lt;p&gt;        public void EndEdit()&lt;br /&gt;        {&lt;br /&gt;            editMode = false;&lt;br /&gt;        }&lt;/p&gt;
&lt;p&gt;        #endregion&lt;/p&gt;
&lt;p&gt;        #region INotifyPropertyChanged Members&lt;/p&gt;
&lt;p&gt;        public event PropertyChangedEventHandler PropertyChanged;&lt;/p&gt;
&lt;p&gt;        private void OnPropertyChanged(string propertyName)&lt;br /&gt;        {&lt;br /&gt;            if (PropertyChanged != null)&lt;br /&gt;                PropertyChanged(this, new PropertyChangedEventArgs(propertyName));&lt;br /&gt;        }&lt;/p&gt;
&lt;p&gt;        #endregion&lt;br /&gt;    }&lt;/p&gt;&lt;img src ="http://blogs.interknowlogy.com/adamcalderon/aggbug/796.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>Adam Calderon</dc:creator><title>Anonymous Methods</title><link>http://blogs.interknowlogy.com/adamcalderon/archive/2005/05/28/163.aspx</link><pubDate>Sat, 28 May 2005 20:27:00 GMT</pubDate><guid>http://blogs.interknowlogy.com/adamcalderon/archive/2005/05/28/163.aspx</guid><description>&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;I was recently doing some research into Anonymous Methods and began to realize how much coding they could save me in some situations. I have always wished for a shortcut to creating code that responds to events. It has always been a pain to create a method with the (object sender, EventArgs e) signature only to have that method call into something else. Now with Anonymous Methods I don&amp;#8217;t have to do that. &lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;So what are Anonymous methods? They are fragments of code that are used with delegates and are written in-line where you would normally reference a method name. The sample below illustrates how this works and compares the old way to the new way.&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;I style="mso-bidi-font-style: normal"&gt;&lt;SPAN style="COLOR: black"&gt;//old way&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/I&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;I style="mso-bidi-font-style: normal"&gt;&lt;SPAN style="COLOR: black"&gt;addButton.Click += &lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;new&lt;/SPAN&gt;&lt;SPAN style="COLOR: black"&gt; EventHandler(AddClick);&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/I&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;I style="mso-bidi-font-style: normal"&gt;&lt;SPAN style="COLOR: black"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/SPAN&gt;&lt;/I&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;I style="mso-bidi-font-style: normal"&gt;&lt;SPAN style="COLOR: black"&gt;//new way&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/I&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;I style="mso-bidi-font-style: normal"&gt;&lt;SPAN style="COLOR: black"&gt;addButton.Click += &lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;delegate&lt;/SPAN&gt;&lt;SPAN style="COLOR: black"&gt; { MessageBox.Show(&amp;#8220;Button was clicked&amp;#8221;) };&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/I&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;SPAN style="COLOR: black"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;SPAN style="COLOR: black"&gt;All that you have to do is have the delegate keyword and insert &lt;/SPAN&gt;your code between the { } and away you go. There are of course some restrictions on what you can do. The sample below gives you a good idea what you can and can&amp;#8217;t do. The form has two buttons normalButton which illustrates your normal event handler and anonymousButton which illustrates an anonymous method.&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;namespace Anon_Methos_Events&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;{&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;SPAN style="mso-tab-count: 1"&gt;            &lt;/SPAN&gt;public partial class Form1 : Form&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;SPAN style="mso-tab-count: 1"&gt;            &lt;/SPAN&gt;{&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;SPAN style="mso-tab-count: 2"&gt;                        &lt;/SPAN&gt;public Form1()&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;SPAN style="mso-tab-count: 2"&gt;                        &lt;/SPAN&gt;{&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;SPAN style="mso-tab-count: 3"&gt;                                    &lt;/SPAN&gt;InitializeComponent();&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;SPAN style="mso-tab-count: 3"&gt;                                    &lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;SPAN style="mso-tab-count: 3"&gt;                                    &lt;/SPAN&gt;//standard and would normally be done by VS inside the form1.Designer.cs code&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;SPAN style="mso-tab-count: 3"&gt;                                    &lt;/SPAN&gt;this.normalButton.Click += new System.EventHandler(this.btnNormal_Click);&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;SPAN style="mso-tab-count: 3"&gt;                                    &lt;/SPAN&gt;//(1) This version works due to implicit conversions&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;SPAN style="mso-tab-count: 3"&gt;                                    &lt;/SPAN&gt;this.anonymousButton.Click += delegate&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;SPAN style="mso-tab-count: 3"&gt;                                    &lt;/SPAN&gt;{&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;SPAN style="mso-tab-count: 4"&gt;                                                &lt;/SPAN&gt;MessageBox.Show("This was done inline with anonymous methods using no parameters and no () after the delegate keyword");&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;SPAN style="mso-tab-count: 3"&gt;                                    &lt;/SPAN&gt;};&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;SPAN style="mso-tab-count: 3"&gt;                                    &lt;/SPAN&gt;//(2) This version is the same as (1) except calls a method&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;SPAN style="mso-tab-count: 3"&gt;                                    &lt;/SPAN&gt;this.anonymousButton.Click += delegate&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;SPAN style="mso-tab-count: 3"&gt;                                    &lt;/SPAN&gt;{&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;SPAN style="mso-tab-count: 4"&gt;                                                &lt;/SPAN&gt;TestAnonymous.MakeSomethingHappen();&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;SPAN style="mso-tab-count: 3"&gt;                                    &lt;/SPAN&gt;};&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;SPAN style="mso-tab-count: 3"&gt;                                    &lt;/SPAN&gt;//(3) This version works because this parameter signature matches&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;SPAN style="mso-tab-count: 3"&gt;                                    &lt;/SPAN&gt;this.anonymousButton.Click += delegate(object sender, EventArgs e){&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;SPAN style="mso-tab-count: 4"&gt;                                                &lt;/SPAN&gt;MessageBox.Show("This was done inline with anonymous methods using parameters");&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;SPAN style="mso-tab-count: 3"&gt;                                    &lt;/SPAN&gt;};&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;SPAN style="mso-tab-count: 3"&gt;                                    &lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;SPAN style="mso-tab-count: 3"&gt;                                    &lt;/SPAN&gt;//(4) This won't work because the empty () indicates that there are no parameters which is incorrect&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;SPAN style="mso-tab-count: 3"&gt;                                    &lt;/SPAN&gt;//this.btnAnonymous.Click += delegate()&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;SPAN style="mso-tab-count: 3"&gt;                                    &lt;/SPAN&gt;//{&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;SPAN style="mso-tab-count: 3"&gt;                                    &lt;/SPAN&gt;//&lt;SPAN style="mso-spacerun: yes"&gt;    &lt;/SPAN&gt;MessageBox.Show("This was done inline with anonymous methods using no parameters and no () after the delegate keyword");&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;SPAN style="mso-tab-count: 3"&gt;                                    &lt;/SPAN&gt;//};&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;SPAN style="mso-tab-count: 2"&gt;                        &lt;/SPAN&gt;}&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;SPAN style="mso-tab-count: 2"&gt;                        &lt;/SPAN&gt;private void btnNormal_Click(object sender, EventArgs e)&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;SPAN style="mso-tab-count: 2"&gt;                        &lt;/SPAN&gt;{&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;SPAN style="mso-tab-count: 3"&gt;                                    &lt;/SPAN&gt;MessageBox.Show("This is a normal event delegate");&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;SPAN style="mso-tab-count: 2"&gt;                        &lt;/SPAN&gt;}&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;SPAN style="mso-tab-count: 1"&gt;            &lt;/SPAN&gt;}&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;SPAN style="mso-tab-count: 1"&gt;            &lt;/SPAN&gt;public static class TestAnonymous&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;SPAN style="mso-tab-count: 1"&gt;            &lt;/SPAN&gt;{&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;SPAN style="mso-tab-count: 2"&gt;                        &lt;/SPAN&gt;public static void MakeSomethingHappen()&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;SPAN style="mso-tab-count: 2"&gt;                        &lt;/SPAN&gt;{&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;SPAN style="mso-tab-count: 3"&gt;                                    &lt;/SPAN&gt;MessageBox.Show("Something happened");&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;SPAN style="mso-tab-count: 2"&gt;                        &lt;/SPAN&gt;}&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;SPAN style="mso-tab-count: 1"&gt;            &lt;/SPAN&gt;}&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;}&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;What is going on with (1) and (2) is that an implicit conversion is occurring from the anonymous method to the EventHandler delegate type (the type of the anonymousButtons event). This implicit conversion is possible because the parameter list and return type of the delegate type are compatible with the anonymous method. In (3) the parameter list for the delegate matches what is expected. In (4) by putting the () at the end the implicit conversion can&amp;#8217;t happen and therefore the code will not work. For a complete reference for Anonymous Methods visit the Beta2 SDK online at &lt;A href="http://msdn2.microsoft.com/library/0yw3tz5k(en-us,vs.80).aspx"&gt;http://msdn2.microsoft.com/library/0yw3tz5k(en-us,vs.80).aspx&lt;/A&gt; &lt;SPAN style="mso-spacerun: yes"&gt; &lt;/SPAN&gt;&lt;/P&gt;&lt;img src ="http://blogs.interknowlogy.com/adamcalderon/aggbug/163.aspx" width = "1" height = "1" /&gt;</description></item></channel></rss>