熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> .NET編程 >> 正文

.NET中的特殊類型成員[2]

2022-06-13   來源: .NET編程 

  屬性

  許多類型定義的屬性可以被重新獲得或修改這些屬性常常都是用類型字段成員來實現的例如下面是包含有兩個字段的類型定義

  class Employee {

  public String Name;

  public Int Age;

  }

  如果創建這個類型的實例那麼很容易用以下代碼得到或設置屬性

  Employee e = new Employee();

  eName = Jeffrey Richter; // 設置名字屬性

  eAge = ; // 設置年齡屬性

  ConsoleWriteLine(eName); // 顯示 Jeffrey Richter

  用這種方式使用屬性非常普通但以我的觀點看上述代碼不會向列出的那樣被實現面向對象設計和編程的立約之一便是數據抽象它的意思就時類型字段不能用公共字段暴露出來因為它太容易被修改太容易讓人寫出不恰當地使用這個字段的代碼從而破壞對象的狀態例如某人很容易編寫下面的代碼破壞Employee對象

  eAge = ; //人的年齡怎麼會是呢?

  所以說在設計類型時我強烈建議所有字段都是私有的(private)或至少是受保護的(protected)——決不要公共的(public)然後讓使用類型的人能Get或Set屬性專門為此提供方法打包對字段的訪問的方法就叫做存取器(或訪問器方法)方法這些方法能隨時實現完整性檢查並保證對象的狀態不被破壞例如我重寫了前面定義過的Employee類代碼如圖一雖然這是一個簡單的例子但你能從中明白抽象數據字段的巨大好處你還能從中明白如何輕松實現只讀屬性或者僅僅通過不去實現某個存取器方法來輕松達到只寫屬性

  顯示的數據抽象方法有兩個缺點第一因為要實現附加的函數所以要多寫一些代碼第二類型的使用者現在必須要調用方法而不是僅僅引用單個的字段名

  eSetAge(); // Updates the age

  eSetAge(); // Throws an exception

  我想所有的人都會同意這些缺點與其優點比起來顯得微不足道但運行時仍然提供了一種屬性機制多少使得第一個缺點容易忍受了並且完全消除了第二個缺點

  類使用了屬性其功能和上面所示的類相同正如你所看到的屬性簡化了一些代碼但更重要的是允許調用這項下面一樣寫自己的代碼

  Age = ; // 更新年齡

  eAge = ; // 擲出異常Throws an exception

  Get屬性存取器的返回值和傳遞到Set屬性存取器參數值類型相同Set屬性存取器的返回值是void而Get屬性存取器沒有入口參數屬性可以是靜態的虛擬的抽象的內部的私有的保護的或公共的另外屬性可以在接口中定義關於這一點將在後面討論

  我還應該指出屬性不必於字段關聯例如類型SystemIOFileStream定義了一個長度屬性它返回流中的字節數當長度屬性的Get方法被調用時這個長度不是由字段提供而是調用另一個函數請求底層操作系統返回打開文件流的字節數

  當你創建屬性時編譯器實際上發出專門的get_ProName和/或set_ProName存取器方法(這裡ProName是屬性名)大多數編譯器會理解這些專用方法並允許開發人員存取這些有專門屬性語法的方法但是遵守公共語言運行時規范的編譯器不需要完全支持屬性只要支持專用存取方法調用即可

  另外對於完全支持屬性的編譯器來說在定義和使用屬性時使用的語法稍有不同例如帶受管擴展的C++需要使用_property關鍵字

[]  []  []  


From:http://tw.wingwit.com/Article/program/net/201311/15661.html
    Copyright © 2005-2022 電腦知識網 Computer Knowledge   All rights reserved.