<?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>Code Analysis Team Blog : Framework Design Guidelines</title><link>http://blogs.msdn.com/fxcop/archive/tags/Framework+Design+Guidelines/default.aspx</link><description>Tags: Framework Design Guidelines</description><dc:language>en-US</dc:language><generator>CommunityServer 2.1 SP1 (Build: 61025.2)</generator><item><title>David Kean's new blog</title><link>http://blogs.msdn.com/fxcop/archive/2008/06/10/david-kean-s-new-blog.aspx</link><pubDate>Tue, 10 Jun 2008 17:00:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:8589158</guid><dc:creator>David M. Kean</dc:creator><slash:comments>1</slash:comments><comments>http://blogs.msdn.com/fxcop/comments/8589158.aspx</comments><wfw:commentRss>http://blogs.msdn.com/fxcop/commentrss.aspx?PostID=8589158</wfw:commentRss><wfw:comment>http://blogs.msdn.com/fxcop/rsscomments.aspx?PostID=8589158</wfw:comment><description>&lt;P&gt;For those that are interested, I've just started a new personal blog, &lt;A class="" href="http://davesbox.com/" mce_href="http://davesbox.com/"&gt;Dave's Box&lt;/A&gt;, where I will be talking about FxCop, Framework Design Guidelines, and the recently announced &lt;A class="" href="http://davesbox.com/archive/2008/06/04/announcing-the-managed-extensibility-framework-ctp.aspx" mce_href="http://davesbox.com/archive/2008/06/04/announcing-the-managed-extensibility-framework-ctp.aspx"&gt;Managed Extensibility Framework&lt;/A&gt;.&lt;/P&gt;
&lt;P&gt;I've just posted&amp;nbsp;a couple of posts detailing changes&amp;nbsp;we made to FxCop 1.36:&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;A class="" href="http://davesbox.com/archive/2008/06/08/fxcop-now-ships-with-the-spell-checker-libraries.aspx" mce_href="http://davesbox.com/archive/2008/06/08/fxcop-now-ships-with-the-spell-checker-libraries.aspx"&gt;FxCop now ships with the spell checker libraries&lt;/A&gt;&lt;BR&gt;&lt;A class="" href="http://davesbox.com/archive/2008/06/10/reference-resolution-changes-in-code-analysis-and-fxcop-part-1.aspx" mce_href="http://davesbox.com/archive/2008/06/10/reference-resolution-changes-in-code-analysis-and-fxcop-part-1.aspx"&gt;Reference resolution changes in Code Analysis and FxCop&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;You can subscribe via the one of the two following links:&lt;/P&gt;
&lt;P&gt;&lt;IMG style="VERTICAL-ALIGN: middle" height=14 src="http://davesbox.com/images/feed-icon-14x14.png" width=14 mce_src="http://blogs.msdn.com/images/feed-icon-14x14.png" mce_style="vertical-align: middle"&gt;&amp;nbsp;&lt;A class=null href="http://feeds.feedburner.com/DavesBox" mce_href="http://feeds.feedburner.com/DavesBox"&gt;Subscribe via reader&lt;/A&gt; &lt;BR&gt;&lt;IMG style="VERTICAL-ALIGN: middle" height=14 src="http://davesbox.com/images/email.gif" width=14 mce_src="http://blogs.msdn.com/images/email.gif" mce_style="vertical-align: middle"&gt;&amp;nbsp;&lt;A class=null href="http://www.feedburner.com/fb/a/emailverifySubmit?feedId=2003699" mce_href="http://www.feedburner.com/fb/a/emailverifySubmit?feedId=2003699"&gt;Subscribe via email&lt;/A&gt;&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=8589158" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/fxcop/archive/tags/Framework+Design+Guidelines/default.aspx">Framework Design Guidelines</category><category domain="http://blogs.msdn.com/fxcop/archive/tags/FxCop/default.aspx">FxCop</category><category domain="http://blogs.msdn.com/fxcop/archive/tags/tsbt-dev/default.aspx">tsbt-dev</category></item><item><title>What do you want to see in the second edition of Framework Design Guidelines?</title><link>http://blogs.msdn.com/fxcop/archive/2008/01/15/what-do-you-want-to-see-in-the-second-edition-of-framework-design-guidelines.aspx</link><pubDate>Tue, 15 Jan 2008 18:00:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:7112171</guid><dc:creator>David M. Kean</dc:creator><slash:comments>9</slash:comments><comments>http://blogs.msdn.com/fxcop/comments/7112171.aspx</comments><wfw:commentRss>http://blogs.msdn.com/fxcop/commentrss.aspx?PostID=7112171</wfw:commentRss><wfw:comment>http://blogs.msdn.com/fxcop/rsscomments.aspx?PostID=7112171</wfw:comment><description>&lt;TABLE class="" cellSpacing=0 cellPadding=0 width="100%" border=0&gt;
&lt;TBODY&gt;
&lt;TR&gt;
&lt;TD class="" vAlign=top width=187&gt;&lt;IMG style="BORDER-TOP-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-RIGHT-WIDTH: 0px" alt="Framework Design Guidelines, Second Edition" src="http://blogs.msdn.com/blogfiles/fxcop/WindowsLiveWriter/WhatdoyouwanttoseeinthesecondeditionofFr_C50F/FrameworkDesignGuidelines_3.jpg" border=0 mce_src="http://blogs.msdn.com/blogfiles/fxcop/WindowsLiveWriter/WhatdoyouwanttoseeinthesecondeditionofFr_C50F/FrameworkDesignGuidelines_3.jpg"&gt;&lt;/TD&gt;
&lt;TD class="" vAlign=top&gt;
&lt;P&gt;&lt;A href="http://blogs.msdn.com/kcwalina" mce_href="http://blogs.msdn.com/kcwalina"&gt;Krzysztof&lt;/A&gt; and &lt;A href="http://blogs.msdn.com/brada" mce_href="http://blogs.msdn.com/brada"&gt;Brad&lt;/A&gt; &lt;A href="http://blogs.msdn.com/kcwalina/archive/2008/01/03/FrameworkDesignGuidelines2ndEdition.aspx" mce_href="http://blogs.msdn.com/kcwalina/archive/2008/01/03/FrameworkDesignGuidelines2ndEdition.aspx"&gt;have announced&lt;/A&gt; they are working on the second edition of the awesome &lt;A href="http://www.amazon.com/Framework-Design-Guidelines-Conventions-Development/dp/0321246756" mce_href="http://www.amazon.com/Framework-Design-Guidelines-Conventions-Development/dp/0321246756"&gt;Framework Design Guidelines&lt;/A&gt; and are looking for feedback on what they should put in it. &lt;/P&gt;
&lt;P&gt;For those that don't know, &lt;EM&gt;a lot&lt;/EM&gt; of our Code Analysis rules are based on the writings in this great book, so expect to see additional rules in the future based on the new guidelines in the second edition.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;To provide feedback, head over to &lt;A class="" href="http://blogs.msdn.com/kcwalina/archive/2008/01/03/FrameworkDesignGuidelines2ndEdition.aspx" mce_href="http://blogs.msdn.com/kcwalina/archive/2008/01/03/FrameworkDesignGuidelines2ndEdition.aspx"&gt;Krzysztof's blog&lt;/A&gt; and post a comment.&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=7112171" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/fxcop/archive/tags/Framework+Design+Guidelines/default.aspx">Framework Design Guidelines</category><category domain="http://blogs.msdn.com/fxcop/archive/tags/Code+Analysis/default.aspx">Code Analysis</category><category domain="http://blogs.msdn.com/fxcop/archive/tags/Books/default.aspx">Books</category></item><item><title>Krzysztof Cwalina on Framework Design Guidelines and API Design</title><link>http://blogs.msdn.com/fxcop/archive/2007/05/10/krzysztof-cwalina-on-framework-design-guidelines-and-api-design.aspx</link><pubDate>Thu, 10 May 2007 18:00:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:2496219</guid><dc:creator>David M. Kean</dc:creator><slash:comments>0</slash:comments><comments>http://blogs.msdn.com/fxcop/comments/2496219.aspx</comments><wfw:commentRss>http://blogs.msdn.com/fxcop/commentrss.aspx?PostID=2496219</wfw:commentRss><wfw:comment>http://blogs.msdn.com/fxcop/rsscomments.aspx?PostID=2496219</wfw:comment><description>&lt;P&gt;A lecture on API design by &lt;A class="" href="http://blogs.msdn.com/kcwalina/" mce_href="http://blogs.msdn.com/kcwalina/"&gt;Krzysztof Cwalina&lt;/A&gt;&amp;nbsp;(the brains behind the &lt;A class="" href="http://www.amazon.com/Framework-Design-Guidelines-Conventions-Development/dp/0321246756" mce_href="http://www.amazon.com/Framework-Design-Guidelines-Conventions-Development/dp/0321246756"&gt;Framewok Design Guidelines&lt;/A&gt;) has &lt;A class="" href="http://blogs.msdn.com/kcwalina/archive/2007/03/29/1989896.aspx" mce_href="http://blogs.msdn.com/kcwalina/archive/2007/03/29/1989896.aspx"&gt;been posted on the Research Channel&lt;/A&gt;.&lt;/P&gt;
&lt;BLOCKQUOTE&gt;
&lt;P&gt;&lt;EM&gt;This class presents best practices for designing frameworks that are reusable object-oriented libraries. The guidelines are applicable to frameworks ranging in size and in their scale of reuse from large system frameworks to small components shared among several applications. They started as a small set of naming and design conventions, but have been enhanced, scrutinized, and refined to a point where they are generally considered the canonical way to design frameworks at Microsoft. They carry the experience and cumulative wisdom of thousands of developer hours, over three versions of the .NET Framework.&lt;/EM&gt;&lt;/P&gt;&lt;/BLOCKQUOTE&gt;
&lt;P&gt;I've seen Krzysztof (and &lt;A class="" href="http://blogs.msdn.com/brada/" mce_href="http://blogs.msdn.com/brada/"&gt;Brad&lt;/A&gt;) present this personally and it is definitely&amp;nbsp;worth seeing. Set some time aside this weekend to watch this and enjoy.&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=2496219" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/fxcop/archive/tags/Framework+Design+Guidelines/default.aspx">Framework Design Guidelines</category><category domain="http://blogs.msdn.com/fxcop/archive/tags/Code+Analysis/default.aspx">Code Analysis</category><category domain="http://blogs.msdn.com/fxcop/archive/tags/FxCop/default.aspx">FxCop</category><category domain="http://blogs.msdn.com/fxcop/archive/tags/Books/default.aspx">Books</category></item><item><title>How to Design Exception Hierarchies</title><link>http://blogs.msdn.com/fxcop/archive/2007/02/01/how-to-design-exception-hierarchies.aspx</link><pubDate>Thu, 01 Feb 2007 19:00:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:1561628</guid><dc:creator>David M. Kean</dc:creator><slash:comments>0</slash:comments><comments>http://blogs.msdn.com/fxcop/comments/1561628.aspx</comments><wfw:commentRss>http://blogs.msdn.com/fxcop/commentrss.aspx?PostID=1561628</wfw:commentRss><wfw:comment>http://blogs.msdn.com/fxcop/rsscomments.aspx?PostID=1561628</wfw:comment><description>&lt;P&gt;Krzysztof Cwalina, owner of the &lt;A class="" href="http://www.amazon.com/Framework-Design-Guidelines-Conventions-Development/dp/0321246756" mce_href="http://www.amazon.com/Framework-Design-Guidelines-Conventions-Development/dp/0321246756"&gt;Framework Design Guidelines&lt;/A&gt;, has written a great post on &lt;A class="" href="http://blogs.msdn.com/kcwalina/archive/2007/01/30/ExceptionHierarchies.aspx" mce_href="http://blogs.msdn.com/kcwalina/archive/2007/01/30/ExceptionHierarchies.aspx"&gt;designing exception hierarchies&lt;/A&gt;. He gives a great overview on the different&amp;nbsp;categories of exceptions, which are placed under two main buckets he calls &lt;EM&gt;usage&lt;/EM&gt; and &lt;EM&gt;system&lt;/EM&gt;, and the right situations to throw them.&lt;/P&gt;
&lt;P&gt;This post also goes hand-in-hand with some of the previous posts on this blog:&lt;BR&gt;&lt;BR&gt;&lt;A class="" href="http://blogs.msdn.com/fxcop/archive/2007/01/22/faq-what-exception-should-i-throw-instead-of-the-reserved-exceptions-found-by-donotraisereservedexceptiontypes.aspx" mce_href="http://blogs.msdn.com/fxcop/archive/2007/01/22/faq-what-exception-should-i-throw-instead-of-the-reserved-exceptions-found-by-donotraisereservedexceptiontypes.aspx"&gt;FAQ: What exception should I throw instead of the reserved exceptions that DoNotRaiseReservedExceptionTypes warns against?&lt;/A&gt;&lt;BR&gt;FAQ: Why does FxCop warn against catch(Exception)? (&lt;A class="" href="http://blogs.msdn.com/fxcop/archive/2006/06/14/FAQ_3A00_-Why-does-FxCop-warn-against-catch_2800_Exception_29003F00_-_2D00_-Part-1-_5B00_Nick-Guerrera_5D00_.aspx" mce_href="http://blogs.msdn.com/fxcop/archive/2006/06/14/FAQ_3A00_-Why-does-FxCop-warn-against-catch_2800_Exception_29003F00_-_2D00_-Part-1-_5B00_Nick-Guerrera_5D00_.aspx"&gt;Part 1&lt;/A&gt;, &lt;A class="" href="http://blogs.msdn.com/fxcop/archive/2006/06/17/FAQ_3A00_-Why-does-FxCop-warn-against-catch_2800_Exception_29003F00_-_2D00_-Part-2-_5B00_Nick-Guerrera_5D00_.aspx" mce_href="http://blogs.msdn.com/fxcop/archive/2006/06/17/FAQ_3A00_-Why-does-FxCop-warn-against-catch_2800_Exception_29003F00_-_2D00_-Part-2-_5B00_Nick-Guerrera_5D00_.aspx"&gt;Part 2&lt;/A&gt;&amp;nbsp;and &lt;A class="" href="http://blogs.msdn.com/fxcop/archive/2006/06/19/FAQ_3A00_-Why-does-FxCop-warn-against-catch_2800_Exception_29003F00_-_2D00_-Part-3-_5B00_Nick-Guerrera_5D00_.aspx" mce_href="http://blogs.msdn.com/fxcop/archive/2006/06/19/FAQ_3A00_-Why-does-FxCop-warn-against-catch_2800_Exception_29003F00_-_2D00_-Part-3-_5B00_Nick-Guerrera_5D00_.aspx"&gt;Part 3&lt;/A&gt;)&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=1561628" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/fxcop/archive/tags/Framework+Design+Guidelines/default.aspx">Framework Design Guidelines</category><category domain="http://blogs.msdn.com/fxcop/archive/tags/Rules/default.aspx">Rules</category><category domain="http://blogs.msdn.com/fxcop/archive/tags/Team+System/default.aspx">Team System</category><category domain="http://blogs.msdn.com/fxcop/archive/tags/Code+Analysis/default.aspx">Code Analysis</category><category domain="http://blogs.msdn.com/fxcop/archive/tags/FxCop/default.aspx">FxCop</category><category domain="http://blogs.msdn.com/fxcop/archive/tags/Exceptions/default.aspx">Exceptions</category></item><item><title>FAQ: Why does DoNotExposeGenericLists recommend that I expose Collection&lt;T&gt; instead of List&lt;T&gt;? [David Kean]</title><link>http://blogs.msdn.com/fxcop/archive/2006/04/27/faq-why-does-donotexposegenericlists-recommend-that-i-expose-collection-lt-t-gt-instead-of-list-lt-t-gt-david-kean.aspx</link><pubDate>Fri, 28 Apr 2006 00:20:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:585476</guid><dc:creator>David M. Kean</dc:creator><slash:comments>3</slash:comments><comments>http://blogs.msdn.com/fxcop/comments/585476.aspx</comments><wfw:commentRss>http://blogs.msdn.com/fxcop/commentrss.aspx?PostID=585476</wfw:commentRss><wfw:comment>http://blogs.msdn.com/fxcop/rsscomments.aspx?PostID=585476</wfw:comment><description>&lt;P&gt;&lt;A href="http://msdn2.microsoft.com/en-us/library/ms182142(VS.80).aspx" mce_href="http://msdn2.microsoft.com/en-us/library/ms182142(VS.80).aspx"&gt;&lt;EM&gt;DoNotExposeGenericLists&lt;/EM&gt;&lt;/A&gt;&lt;EM&gt; fires when I publicly expose List&amp;lt;T&amp;gt; via a field, method, property, or parameter. Why?&lt;/EM&gt;&lt;/P&gt;
&lt;P&gt;Although Krzysztof &lt;A href="http://blogs.msdn.com/kcwalina/archive/2005/09/26/474010.aspx" mce_href="http://blogs.msdn.com/kcwalina/archive/2005/09/26/474010.aspx"&gt;briefly touched on this last year&lt;/A&gt;,&amp;nbsp;we wanted to expand on this a little through the use of examples.&lt;/P&gt;
&lt;P&gt;The first reason is that List&amp;lt;T&amp;gt; is designed for speed and for use as an internal implementation detail, whereas Collection&amp;lt;T&amp;gt; is designed for extensibility.&lt;/P&gt;
&lt;P&gt;Collection&amp;lt;T&amp;gt; provides 4 overridable methods; ClearItems, InsertItem, RemoveItem and SetItem, which allow a derived class to be notified when a collection has been modified. In contrast, List&amp;lt;T&amp;gt; provides none.&lt;/P&gt;
&lt;P&gt;As an example, let’s say in V1.0 of your framework, you have a Person class that exposes a collection of addresses. You could choose to expose this via a property that returns either a List&amp;lt;Address&amp;gt; or Collection&amp;lt;Address&amp;gt; :&lt;/P&gt;
&lt;P&gt;List&amp;lt;Address&amp;gt;:&lt;/P&gt;
&lt;DIV style="FONT-SIZE: 9pt; FONT-FAMILY: monospace; BACKGROUND-COLOR: white"&gt;&lt;SPAN style="COLOR: blue"&gt;public&lt;/SPAN&gt;&lt;SPAN style="COLOR: black"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;class&lt;/SPAN&gt;&lt;SPAN style="COLOR: black"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: teal"&gt;Person&lt;BR&gt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: black"&gt;{&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;private&lt;/SPAN&gt;&lt;SPAN style="COLOR: black"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: teal"&gt;List&lt;/SPAN&gt;&lt;SPAN style="COLOR: black"&gt;&amp;lt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: teal"&gt;Address&lt;/SPAN&gt;&lt;SPAN style="COLOR: black"&gt;&amp;gt; _Addresses = &lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;new&lt;/SPAN&gt;&lt;SPAN style="COLOR: black"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: teal"&gt;List&lt;/SPAN&gt;&lt;SPAN style="COLOR: black"&gt;&amp;lt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: teal"&gt;Address&lt;/SPAN&gt;&lt;SPAN style="COLOR: black"&gt;&amp;gt;();&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;[...]&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;public&lt;/SPAN&gt;&lt;SPAN style="COLOR: black"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: teal"&gt;List&lt;/SPAN&gt;&lt;SPAN style="COLOR: black"&gt;&amp;lt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: teal"&gt;Address&lt;/SPAN&gt;&lt;SPAN style="COLOR: black"&gt;&amp;gt; Addresses&lt;BR&gt;&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;&lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;get&lt;/SPAN&gt;&lt;SPAN style="COLOR: black"&gt; { &lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;return&lt;/SPAN&gt;&lt;SPAN style="COLOR: black"&gt; _Addresses; }&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;BR&gt;}&lt;/SPAN&gt; &lt;/DIV&gt;
&lt;P&gt;Collection&amp;lt;Address&amp;gt;:&lt;/P&gt;
&lt;DIV style="FONT-SIZE: 9pt; FONT-FAMILY: monospace; BACKGROUND-COLOR: white"&gt;&lt;SPAN style="COLOR: blue"&gt;public&lt;/SPAN&gt;&lt;SPAN style="COLOR: black"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;class&lt;/SPAN&gt;&lt;SPAN style="COLOR: black"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: teal"&gt;Person&lt;BR&gt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: black"&gt;{&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;private&lt;/SPAN&gt;&lt;SPAN style="COLOR: black"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: teal"&gt;Collection&lt;/SPAN&gt;&lt;SPAN style="COLOR: black"&gt;&amp;lt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: teal"&gt;Address&lt;/SPAN&gt;&lt;SPAN style="COLOR: black"&gt;&amp;gt; _Addresses = &lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;new&lt;/SPAN&gt;&lt;SPAN style="COLOR: black"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: teal"&gt;Collection&lt;/SPAN&gt;&lt;SPAN style="COLOR: black"&gt;&amp;lt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: teal"&gt;Address&lt;/SPAN&gt;&lt;SPAN style="COLOR: black"&gt;&amp;gt;();&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;[...]&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;public&lt;/SPAN&gt;&lt;SPAN style="COLOR: black"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: teal"&gt;Collection&lt;/SPAN&gt;&lt;SPAN style="COLOR: black"&gt;&amp;lt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: teal"&gt;Address&lt;/SPAN&gt;&lt;SPAN style="COLOR: black"&gt;&amp;gt; Addresses&lt;BR&gt;&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;&lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;get&lt;/SPAN&gt;&lt;SPAN style="COLOR: black"&gt; { &lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;return&lt;/SPAN&gt;&lt;SPAN style="COLOR: black"&gt; _Addresses; }&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;BR&gt;}&lt;/SPAN&gt; &lt;/DIV&gt;
&lt;P&gt;Along comes V2.0 of your framework, and your users have asked you to expose an event that gets raised every time an address is added or removed from the collection. Had you originally headed down the List&amp;lt;T&amp;gt; route, you’ve now painted yourself in a corner. There is no way to be notified (without breaking existing clients) of when an external object modifies the collection. However, had you chose to expose Collection&amp;lt;T&amp;gt;, you can now do something like the following:&lt;/P&gt;
&lt;DIV style="FONT-SIZE: 9pt; FONT-FAMILY: monospace; BACKGROUND-COLOR: white"&gt;&lt;SPAN style="COLOR: blue"&gt;public&lt;/SPAN&gt;&lt;SPAN style="COLOR: black"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;class&lt;/SPAN&gt;&lt;SPAN style="COLOR: black"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: teal"&gt;Person&lt;BR&gt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: black"&gt;{&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;private&lt;/SPAN&gt;&lt;SPAN style="COLOR: black"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: teal"&gt;AddressCollection&lt;/SPAN&gt;&lt;SPAN style="COLOR: black"&gt; _Addresses = &lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;new&lt;/SPAN&gt;&lt;SPAN style="COLOR: black"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: teal"&gt;AddressCollection&lt;/SPAN&gt;&lt;SPAN style="COLOR: black"&gt;(&lt;SPAN style="COLOR: blue"&gt;this&lt;/SPAN&gt;);&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;[...]&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;public&lt;/SPAN&gt;&lt;SPAN style="COLOR: black"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;event&lt;/SPAN&gt;&lt;SPAN style="COLOR: black"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: teal"&gt;EventHandler&lt;/SPAN&gt;&lt;SPAN style="COLOR: black"&gt; AddressChanged;&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;public&lt;/SPAN&gt;&lt;SPAN style="COLOR: black"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: teal"&gt;Collection&lt;/SPAN&gt;&lt;SPAN style="COLOR: black"&gt;&amp;lt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: teal"&gt;Address&lt;/SPAN&gt;&lt;SPAN style="COLOR: black"&gt;&amp;gt; Addresses&lt;BR&gt;&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;&lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;get&lt;/SPAN&gt;&lt;SPAN style="COLOR: black"&gt; { &lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;return&lt;/SPAN&gt;&lt;SPAN style="COLOR: black"&gt; _Addresses; }&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;protected&lt;/SPAN&gt;&lt;SPAN style="COLOR: black"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;virtual&lt;/SPAN&gt;&lt;SPAN style="COLOR: black"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;void&lt;/SPAN&gt;&lt;SPAN style="COLOR: black"&gt; OnAddressChanged(&lt;/SPAN&gt;&lt;SPAN style="COLOR: teal"&gt;EventArgs&lt;/SPAN&gt;&lt;SPAN style="COLOR: black"&gt; e)&lt;BR&gt;&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;&lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;if&lt;/SPAN&gt;&lt;SPAN style="COLOR: black"&gt; (AddressChanged != &lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;null&lt;/SPAN&gt;&lt;SPAN style="COLOR: black"&gt;)&lt;BR&gt;&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;AddressChanged(&lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;this&lt;/SPAN&gt;&lt;SPAN style="COLOR: black"&gt;, e);&lt;BR&gt;&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;}&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;private&lt;/SPAN&gt;&lt;SPAN style="COLOR: black"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;void&lt;/SPAN&gt;&lt;SPAN style="COLOR: black"&gt; RaiseAddressChanged()&lt;BR&gt;&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;OnAddressChanged(&lt;/SPAN&gt;&lt;SPAN style="COLOR: teal"&gt;EventArgs&lt;/SPAN&gt;&lt;SPAN style="COLOR: black"&gt;.Empty);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;private&lt;/SPAN&gt;&lt;SPAN style="COLOR: black"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;class&lt;/SPAN&gt;&lt;SPAN style="COLOR: black"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: teal"&gt;AddressCollection&lt;/SPAN&gt;&lt;SPAN style="COLOR: black"&gt; : &lt;/SPAN&gt;&lt;SPAN style="COLOR: teal"&gt;Collection&lt;/SPAN&gt;&lt;SPAN style="COLOR: black"&gt;&amp;lt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: teal"&gt;Address&lt;/SPAN&gt;&lt;SPAN style="COLOR: black"&gt;&amp;gt;&lt;BR&gt;&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;&lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;private&lt;/SPAN&gt;&lt;SPAN style="COLOR: black"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: teal"&gt;Person&lt;/SPAN&gt;&lt;SPAN style="COLOR: black"&gt; _Owner;&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;public&lt;/SPAN&gt;&lt;SPAN style="COLOR: black"&gt; AddressCollection(&lt;/SPAN&gt;&lt;SPAN style="COLOR: teal"&gt;Person&lt;/SPAN&gt;&lt;SPAN style="COLOR: black"&gt; owner)&lt;BR&gt;&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;_Owner = owner;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;protected&lt;/SPAN&gt;&lt;SPAN style="COLOR: black"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;override&lt;/SPAN&gt;&lt;SPAN style="COLOR: black"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;void&lt;/SPAN&gt;&lt;SPAN style="COLOR: black"&gt; InsertItem(&lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;int&lt;/SPAN&gt;&lt;SPAN style="COLOR: black"&gt; index, &lt;/SPAN&gt;&lt;SPAN style="COLOR: teal"&gt;Address&lt;/SPAN&gt;&lt;SPAN style="COLOR: black"&gt; item)&lt;BR&gt;&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;&lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;base&lt;/SPAN&gt;&lt;SPAN style="COLOR: black"&gt;.InsertItem(index, item);&lt;BR&gt;&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;_Owner.RaiseAddressChanged();&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;protected&lt;/SPAN&gt;&lt;SPAN style="COLOR: black"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;override&lt;/SPAN&gt;&lt;SPAN style="COLOR: black"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;void&lt;/SPAN&gt;&lt;SPAN style="COLOR: black"&gt; RemoveItem(&lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;int&lt;/SPAN&gt;&lt;SPAN style="COLOR: black"&gt; index)&lt;BR&gt;&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;&lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;base&lt;/SPAN&gt;&lt;SPAN style="COLOR: black"&gt;.RemoveItem(index);&lt;BR&gt;&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;_Owner.RaiseAddressChanged();&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;protected&lt;/SPAN&gt;&lt;SPAN style="COLOR: black"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;override&lt;/SPAN&gt;&lt;SPAN style="COLOR: black"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;void&lt;/SPAN&gt;&lt;SPAN style="COLOR: black"&gt; ClearItems()&lt;BR&gt;&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;&lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;base&lt;/SPAN&gt;&lt;SPAN style="COLOR: black"&gt;.ClearItems();&lt;BR&gt;&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;_Owner.RaiseAddressChanged();&lt;BR&gt;&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;}&lt;BR&gt;}&lt;/SPAN&gt;&lt;/DIV&gt;
&lt;DIV style="FONT-SIZE: 9pt; FONT-FAMILY: monospace; BACKGROUND-COLOR: white"&gt;&lt;SPAN style="COLOR: black"&gt;&lt;/SPAN&gt;&lt;BR&gt;&amp;nbsp;&lt;/DIV&gt;
&lt;P&gt;From the above code you can see that&amp;nbsp;you are still exposing the same Collection&amp;lt;Address&amp;gt; property, so no breaking change was made, however, your users can now be notified when someone changes the collection. &lt;/P&gt;
&lt;P&gt;The second reason why you shouldn’t expose List&amp;lt;T&amp;gt;, is because it exposes too many members, many of which are not relevant in most situations. In contrast, Collection&amp;lt;T&amp;gt; exposes only a small number. For those that are relevant, it is easy to encapsulate List&amp;lt;T&amp;gt; and expose those that you want to make use of via a class that derives from Collection&amp;lt;T&amp;gt;.&amp;nbsp; For example, continuing on from above:&lt;/P&gt;
&lt;DIV style="FONT-SIZE: 9pt; FONT-FAMILY: monospace; BACKGROUND-COLOR: white"&gt;&lt;SPAN style="COLOR: blue"&gt;public&lt;/SPAN&gt;&lt;SPAN style="COLOR: black"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;class&lt;/SPAN&gt;&lt;SPAN style="COLOR: black"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: teal"&gt;AddressCollection&lt;/SPAN&gt;&lt;SPAN style="COLOR: black"&gt; : &lt;/SPAN&gt;&lt;SPAN style="COLOR: teal"&gt;Collection&lt;/SPAN&gt;&lt;SPAN style="COLOR: black"&gt;&amp;lt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: teal"&gt;Address&lt;/SPAN&gt;&lt;SPAN style="COLOR: black"&gt;&amp;gt;&lt;BR&gt;{&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;public&lt;/SPAN&gt;&lt;SPAN style="COLOR: black"&gt; AddressCollection() : &lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;base&lt;/SPAN&gt;&lt;SPAN style="COLOR: black"&gt;(&lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;new&lt;/SPAN&gt;&lt;SPAN style="COLOR: black"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: teal"&gt;List&lt;/SPAN&gt;&lt;SPAN style="COLOR: black"&gt;&amp;lt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: teal"&gt;Address&lt;/SPAN&gt;&lt;SPAN style="COLOR: black"&gt;&amp;gt;())&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;public&lt;/SPAN&gt;&lt;SPAN style="COLOR: black"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: teal"&gt;Address&lt;/SPAN&gt;&lt;SPAN style="COLOR: black"&gt; Find(&lt;/SPAN&gt;&lt;SPAN style="COLOR: teal"&gt;Predicate&lt;/SPAN&gt;&lt;SPAN style="COLOR: black"&gt;&amp;lt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: teal"&gt;Address&lt;/SPAN&gt;&lt;SPAN style="COLOR: black"&gt;&amp;gt; match)&lt;BR&gt;&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;&lt;/SPAN&gt;&lt;SPAN style="COLOR: green"&gt;// We know Items is actually a List&amp;lt;Address&amp;gt; as we passed it to the constructor&lt;BR&gt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: black"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN style="COLOR: teal"&gt;List&lt;/SPAN&gt;&lt;SPAN style="COLOR: black"&gt;&amp;lt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: teal"&gt;Address&lt;/SPAN&gt;&lt;SPAN style="COLOR: black"&gt;&amp;gt; items = (&lt;/SPAN&gt;&lt;SPAN style="COLOR: teal"&gt;List&lt;/SPAN&gt;&lt;SPAN style="COLOR: black"&gt;&amp;lt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: teal"&gt;Address&lt;/SPAN&gt;&lt;SPAN style="COLOR: black"&gt;&amp;gt;)Items;&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;return&lt;/SPAN&gt;&lt;SPAN style="COLOR: black"&gt; items.Find(match);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;BR&gt;}&lt;/SPAN&gt;&lt;/DIV&gt;
&lt;P&gt;As you can see, the AddressCollection simply calls the underlying List&amp;lt;T&amp;gt;'s Find implementation, saving you from having to implement your own.&lt;/P&gt;
&lt;P&gt;If you have any questions or issues with Managed Code Analysis or FxCop (including DoNotExposeGenericLists), don’t hesitate to head over to the &lt;A href="http://forums.microsoft.com/MSDN/ShowForum.aspx?ForumID=98&amp;amp;SiteID=1" mce_href="http://forums.microsoft.com/MSDN/ShowForum.aspx?ForumID=98&amp;amp;SiteID=1"&gt;FxCop Forum&lt;/A&gt;.&lt;BR&gt;&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=585476" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/fxcop/archive/tags/FAQ/default.aspx">FAQ</category><category domain="http://blogs.msdn.com/fxcop/archive/tags/Framework+Design+Guidelines/default.aspx">Framework Design Guidelines</category><category domain="http://blogs.msdn.com/fxcop/archive/tags/Rules/default.aspx">Rules</category><category domain="http://blogs.msdn.com/fxcop/archive/tags/Team+System/default.aspx">Team System</category><category domain="http://blogs.msdn.com/fxcop/archive/tags/Code+Analysis/default.aspx">Code Analysis</category></item><item><title>Seen any Microsoft produced code that doesn't pass Code Analysis/FxCop? [David Kean]</title><link>http://blogs.msdn.com/fxcop/archive/2006/04/11/WeWantYourFeedback.aspx</link><pubDate>Wed, 12 Apr 2006 07:51:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:574679</guid><dc:creator>David M. Kean</dc:creator><slash:comments>16</slash:comments><comments>http://blogs.msdn.com/fxcop/comments/574679.aspx</comments><wfw:commentRss>http://blogs.msdn.com/fxcop/commentrss.aspx?PostID=574679</wfw:commentRss><wfw:comment>http://blogs.msdn.com/fxcop/rsscomments.aspx?PostID=574679</wfw:comment><description>&lt;P&gt;As some of you may already know, the majority of the Developer Division is currently planning features to be included in the next version of Visual Studio (Orcas). As part of this planning phase, the Managed Code Analysis (FxCop) team is beginning to work with other teams around Microsoft to ensure that any customer facing code released in Orcas is Code Analysis clean.&lt;BR&gt;&amp;nbsp;&lt;BR&gt;We’re also asking for your help. If you’ve &lt;U&gt;ever&lt;/U&gt; come across code that hasn’t passed Code Analysis whether that be generated by custom tools, compilers, MSDN Library examples, sample applications, templates, designers, articles or any other Microsoft produced code, we want to hear about it.&lt;/P&gt;
&lt;P&gt;Blog about it, tell your colleagues, managers, friends, spouses (if they write code), mailing lists, forums and any other medium that you can think of that if they have ever come across code that made them say ‘&lt;EM&gt;Damn Microsoft, I wish they would follow their own guidelines&lt;/EM&gt;’ - then the Code Analysis team wants to hear from them.&lt;/P&gt;
&lt;P&gt;As an example of what kind of issues we are looking for, see the following Product Feedback Center bugs:&lt;/P&gt;
&lt;P&gt;&lt;A href="http://lab.msdn.microsoft.com/productfeedback/viewfeedback.aspx?feedbackid=a0bfd9a2-f07f-4c5c-8843-979aabceb60d"&gt;Prevent generated DSL code from producing FxCop warnings&lt;/A&gt;&lt;BR&gt;&lt;A href="http://lab.msdn.microsoft.com/productfeedback/viewfeedback.aspx?feedbackid=8d7cde0f-ac12-46c7-80a3-c6fbe9f7ba48"&gt;Windows Service template Dispose method does not pass FxCop analysis&lt;/A&gt;&lt;BR&gt;&lt;A href="http://lab.msdn.microsoft.com/productfeedback/viewfeedback.aspx?feedbackid=60ac6c11-2f0f-4dea-80d5-6d31aa6e5e14"&gt;AssemblyInfo to be FxCop compliant by default&lt;/A&gt;&lt;BR&gt;&lt;A href="http://lab.msdn.microsoft.com/productfeedback/viewfeedback.aspx?feedbackid=43953cae-b62d-4a9e-acd3-3d557ae96253"&gt;"exception" expansion code sniplet has incorrect "public" visibility for serialisation contructor. FxCop rule violation&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;You can either post your feedback via a comment below or by using this blog's&amp;nbsp;&lt;A href="http://blogs.msdn.com/fxcop/contact.aspx"&gt;contact form&lt;/A&gt;.&lt;BR&gt;&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=574679" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/fxcop/archive/tags/Framework+Design+Guidelines/default.aspx">Framework Design Guidelines</category><category domain="http://blogs.msdn.com/fxcop/archive/tags/Community/default.aspx">Community</category><category domain="http://blogs.msdn.com/fxcop/archive/tags/Rules/default.aspx">Rules</category><category domain="http://blogs.msdn.com/fxcop/archive/tags/Team+System/default.aspx">Team System</category><category domain="http://blogs.msdn.com/fxcop/archive/tags/Code+Analysis/default.aspx">Code Analysis</category></item><item><title>FAQ: Why do some sources recommend extending ApplicationException while FxCop does not? [Michael Fanning, David Kean]</title><link>http://blogs.msdn.com/fxcop/archive/2006/04/05/faq-why-do-some-sources-recommend-extending-applicationexception-while-fxcop-does-not-michael-fanning-david-kean.aspx</link><pubDate>Thu, 06 Apr 2006 06:21:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:569569</guid><dc:creator>David M. Kean</dc:creator><slash:comments>7</slash:comments><comments>http://blogs.msdn.com/fxcop/comments/569569.aspx</comments><wfw:commentRss>http://blogs.msdn.com/fxcop/commentrss.aspx?PostID=569569</wfw:commentRss><wfw:comment>http://blogs.msdn.com/fxcop/rsscomments.aspx?PostID=569569</wfw:comment><description>&lt;P&gt;&lt;EM&gt;&lt;A class="" href="http://msdn2.microsoft.com/en-us/library/ms182171.aspx" mce_href="http://msdn2.microsoft.com/en-us/library/ms182171.aspx"&gt;TypesShouldNotExtendCertainBaseTypes&lt;/A&gt;&lt;/EM&gt;&lt;EM&gt; fires on types that derive from ApplicationException and &lt;/EM&gt;&lt;A class="" href="http://msdn2.microsoft.com/en-gb/library/ms182338.aspx" mce_href="http://msdn2.microsoft.com/en-gb/library/ms182338.aspx"&gt;&lt;EM&gt;DoNotRaiseReservedExceptionTypes&lt;/EM&gt;&lt;/A&gt;&lt;EM&gt;&amp;nbsp;on members that throw ApplicationException. Why?&lt;/EM&gt;&lt;/P&gt;
&lt;P&gt;There are several outdated documents floating around on the web (some orginally published by Microsoft) recommending that application developers extend ApplicationException. However, this guidance was revised several years ago for a couple of reasons:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;It deepens the class hierarchy and presents additional complications for consumers writing exception handlers without providing additional value. 
&lt;LI&gt;It prevents the reuse of existing exception classes defined in the Base Class Library (BCL).&lt;/LI&gt;&lt;/UL&gt;
&lt;P&gt;The official &lt;A href="http://msdn2.microsoft.com/en-US/library/ms229042(VS.80).aspx" mce_href="http://msdn2.microsoft.com/en-US/library/ms229042(VS.80).aspx"&gt;Microsoft Design Guidelines&lt;/A&gt;,&amp;nbsp;particularly the &lt;A href="http://msdn2.microsoft.com/en-US/library/ms229007(VS.80).aspx" mce_href="http://msdn2.microsoft.com/en-US/library/ms229007(VS.80).aspx"&gt;Catching and&amp;nbsp;Throwing&amp;nbsp;Standard Exception Types&lt;/A&gt; section,&amp;nbsp;have only recently been revamped to include this new information. Both Krzysztof Cwalina and Brad Abrams, who own the &lt;A class="" href="http://www.amazon.com/Framework-Design-Guidelines-Conventions-Development/dp/0321246756" mce_href="http://www.amazon.com/Framework-Design-Guidelines-Conventions-Development/dp/0321246756"&gt;Framework Design Guidelines&lt;/A&gt; at Microsoft, have both blogged on this issue (&lt;A class="" href="http://blogs.msdn.com/kcwalina/archive/2006/06/23/644822.aspx" mce_href="http://blogs.msdn.com/kcwalina/archive/2006/06/23/644822.aspx"&gt;ApplicationException considered useless&lt;/A&gt; and &lt;A class="" href="http://blogs.msdn.com/brada/archive/2004/03/25/96251.aspx" mce_href="http://blogs.msdn.com/brada/archive/2004/03/25/96251.aspx"&gt;Introducing the .NET Framework Standard Library Annotated Reference&lt;/A&gt;).&lt;/P&gt;
&lt;P&gt;If you see any MSDN samples or articles that&amp;nbsp;use ApplicationException (or&amp;nbsp;violate any FxCop rule, for that matter), please file a bug on the &lt;A class="" href="http://connect.microsoft.com/site/sitehome.aspx?SiteID=210" mce_href="http://connect.microsoft.com/site/sitehome.aspx?SiteID=210"&gt;Microsoft Connect&lt;/A&gt;.&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=569569" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/fxcop/archive/tags/FAQ/default.aspx">FAQ</category><category domain="http://blogs.msdn.com/fxcop/archive/tags/Framework+Design+Guidelines/default.aspx">Framework Design Guidelines</category><category domain="http://blogs.msdn.com/fxcop/archive/tags/Rules/default.aspx">Rules</category><category domain="http://blogs.msdn.com/fxcop/archive/tags/Team+System/default.aspx">Team System</category><category domain="http://blogs.msdn.com/fxcop/archive/tags/Code+Analysis/default.aspx">Code Analysis</category><category domain="http://blogs.msdn.com/fxcop/archive/tags/Exceptions/default.aspx">Exceptions</category></item></channel></rss>