開發人員最希望看到的C# 4.0新特性

來源:互聯網
上載者:User

本文介紹了作者希望在C# 4.0中希望看到的新特性,比如通過委託成員來實現介面、匿名傳回型別等等,但很遺憾,在C# 4.0中並沒有出現。

1. 通過委託成員來實現介面

在C# 4.0中可以通過委託來實現某個成員的介面,例如下面的代碼:

 
  1. public class Foo : IList
  2. {
  3. private List _Collection implements IList;
  4. public Foo()
  5. {
  6. _Collection = new List();
  7. }
  8. }

被封閉的成員可以用委託實現一個或多個介面,多個介面用逗號分隔。這麼做可以去掉很多冗餘的代碼,就像上面的樣本,不再需要在封閉類(Foo類)上寫一大堆方法來將介面實現交給成員變數,介面的實現會直接映射到受委託的介面實現(_Collection成員變數)。這個功能同樣增強了對minxins的支援。這個就是“委託模式”了,wikipedia上對此模式的解釋如下:

委託模式是指一個對象對外表現某種行為,但事實上只是將實現此行為的任務將會給一個相關的成員的技術,這種技術反轉了責任。委託模式是加強組合 (彙總)、minxins及aspects的一種基本模式。再進一步,在委託實現介面之餘,我們也應當可以自由地重寫某些方法如下:

 
  1. public class Foo : IList
  2. {
  3. private List _Collection { get; set; } implements IList;
  4. public Foo()
  5. {
  6. _Collection = new List();
  7. }
  8. //這將覆蓋委託的執行
  9. // 漂亮的混入和方便的功能
  10. pattern implementation
  11. public int IList.Add(string value)
  12. {
  13. if (!_Collection.Contains(value))
  14. _Collection.Add(value);
  15. }
  16. }

2. 匿名傳回型別

在C#中匿名型別可以擁有像普通的類聲明一樣的地位。(當前)匿名型別只能用於局部變數,不能作為方法的傳回值。但是如果一個強型別的LINQ查詢的傳回型別可以作為方法的傳回型別一定很好,比如下面的代碼:

 
  1. public var GetProductInfos()
  2. {
  3. var productInfos =
  4. from p in products
  5. select new { p.ProductName, p.Category, Price = p.UnitPrice };
  6. return productInfos;
  7. }

3. 一些 Duck-typing or Structural Subtyping 類型的支援

如果一個類中的某一個方法/屬性的簽名和某個介面一樣,並且這個類沒有實現此介面,那麼這個類就將隱式地實現這個介面。只有這個類實現了介面規定的所有方法/屬性的時候才被認為隱式地實現了此介面。那麼這個和Structural Subtyping有什麼區別?我承認structural subtyping更適合C#的靜態樣式,所以這是個'static duck typing',或者如wikipedia所述:

Duck typing與structural typing的區別僅在於類型中被訪問的部分在運行期才做相容性確認。我們將通過一個用例來說明這種方法有什麼好處:在.NET架構中,一部分控制項實現了一個叫ReadOnly的屬性,比如TextBox, DataGrid, NumericUpDown。現在我們建一個叫IReadOnlyRestricable的介面:

 
  1. public interface IReadOnlyRestricable
  2. {
  3. bool ReadOnly { get; set; }
  4. }

然後我們要遍曆所有的控制項,找出有ReadOnly屬性的控制項並把此屬性設為true(譯者註:這些控制項本身沒有實現IReadOnlyRestricable),在ducktyping下我們可以把控制項通過類型轉換為IReadOnlyRestricable,就像下面代碼一樣,這樣我們就不需要通過反射去定位ReadOnly屬性了:

 
  1. foreach (Control c in f.Controls)
  2. {
  3. //希望有隱式轉換
  4. IReadOnlyRestrictable if interface contract is in class we are checking against
  5. IReadOnlyRestricable editable = c as IReadOnlyRestricable;
  6. if (editable != null)
  7. editable.ReadOnly = true;
  8. }

ducktyping的最大好處是可以為你不需要訪問的類庫定義一些介面,這可以儘可能地減少相互依賴。

4. 安全的null延遲賦值操作符

我很想看到一種安全地訪問一個值為null的對象的屬性的運算式,運算式可能形如Object.Property.Property.Value。比如我要訪問Customer?.FirstName,但是Customer是null,此時Customer?.FirstName會返回null而不是拋出個NullReferenceException。再看看下面的代碼:

 
  1. //如果不是客戶或命令無效,這將拋出一個像往常一樣Null 參考異常
  2. int orderNumber = Customer.Order.OrderNumber;

 

 

 
  1. //這將無法編譯,因為它需要一個空的傳回型別
  2. int orderNumber = Customer.Order?.OrderNumber;

 

 

 
  1. //這將返回null,如果客戶是空或者如果命令是空
  2. int? orderNumber = Customer?.Order?.OrderNumber;
  3. if (orderNumber.HasValue)

 

 

 

 
  1. //... 用它做一些事情
  2. //而不是必須做
  3. if ((Customer != null) && (Customer.Order != null))
  4. int a = Customer.Order.OrderNumber

原文地址:http://www.cnblogs.com/smallnumber/archive/2010/08/16/VisualStudio2010CSharp4.html

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.