最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

c# 類型的字段和方法設(shè)計建議

 更新時間:2020年11月19日 12:00:39   作者:一只獨行的猿  
這篇文章主要介紹了c# 字段和方法設(shè)計建議,幫助大家更好的理解和使用c#編程語言,感興趣的朋友可以了解下

1、不要為抽象類提供公開的構(gòu)造方法

  抽象類可以有構(gòu)造方法,但是抽象類不能實例化。如果編程人員沒有制定構(gòu)造方法,編譯器會自動生成一個默認的protected構(gòu)造方法。下面是一個標準的簡單抽象類:

abstract class MyAbstractClass
{
 protected MyAbstractClass( ) { }
}

  抽象類的構(gòu)造方法不應(yīng)該是public或internal的。抽象類設(shè)計的本意是只能讓子類繼承,而不是用于生成實例對象。如果抽象類是public或者internal的,它對于其他類型來說就是可見的,而這是不必要的,多余的。抽象類只需對子類可見即可。

2、可見字段應(yīng)該重構(gòu)為屬性

  字段與屬性有本質(zhì)的區(qū)別,屬性是方法。如下面的Person類型:

class Person
{
 public string Name { get; set; }
}

  編譯器針對屬性Name編譯后,會生成一個字段和兩個方法。

  屬性相對于字段有如下優(yōu)勢:

    1)可以為屬性添加代碼。屬性是方法,所以可以在方法內(nèi)對設(shè)置或獲取屬性的過程進行編寫代碼控制。如事件支持等。

    2)可以讓屬性支持線程安全。要讓屬性變成線程安全的,可以讓類型自身去實現(xiàn)。如果讓字段支持線程安全,就只有依靠調(diào)用者本身實現(xiàn)。

    3)屬性得到VS編譯器支持,能實現(xiàn)自動屬性的功能。自動屬性的特點在LINQ中應(yīng)用十分廣泛,在匿名類型中,它只能實現(xiàn)只讀的自動屬性,但字段不支持。

    4)從設(shè)計的角度(面向?qū)ο螅?,公開的字段也應(yīng)該使用屬性。改變字段的狀態(tài),類型不會被通知到;而改變屬性的值,類型支持則會被通知。

  綜上,如果一個類型存在一個可見字段,那么它應(yīng)該被重構(gòu)為屬性。如果某個屬性只對內(nèi)部可見,但不涉及上面4點,則建議使用字段。

3、區(qū)別對待override和new

  override和new使類型體系因為繼承而呈現(xiàn)出多態(tài)性。多態(tài)是“面向?qū)ο笳Z言”的三個重要特性之一。多態(tài)要求子類具有與基類方法同名的方法,而override和new的有如下作用:

    1)如果子類中的方法前面帶有new關(guān)鍵字,則該方法被定義為獨立于基類的方法。

    2)如果子類中的方法前面帶有override關(guān)鍵字,則子類的對象將調(diào)用該方法,而不是調(diào)用基類的方法。

  如果,對于父類的方法在子類中使用了new關(guān)鍵字,則兩個方法相互獨立。此時,使用子類類型的對象調(diào)用方法時,程序執(zhí)行的將是子類類型new的方法代碼;而如果將子類類型轉(zhuǎn)換為父類類型后,對象調(diào)用方法時將執(zhí)行的是父類的方法代碼。

  如果使用了override關(guān)鍵字重寫方法,那么不論子類類型的對象是否轉(zhuǎn)換為父類類型,調(diào)用方法時都將執(zhí)行的是子類的代碼。

  如果對于子類中,聲明與父類相同函數(shù)名稱的方法,但并不使用關(guān)鍵字new和override。編譯器在編譯后會提出警告,但不影響程序運行。此時,編譯器會默認為是new的效果,所以輸出和顯示設(shè)置與new的效果一樣。

4、避免在構(gòu)造方法中調(diào)用虛成員

  在構(gòu)造方法中調(diào)用虛成員會出現(xiàn)意想不到的錯誤。

class Program
 {
  static void Main(string[] args)
  {
   Chinese chinese = new Chinese();
  }
 }

 class Person
 {
  public Person()
  {
   InitSkin();
  }

  protected virtual void InitSkin()
  {
   //省略
  }
 }

 class Chinese:Person
 {
  Rece Rece;

  public Chinese():base()
  {
   Rece = new Rece() { Name = "趙銘" };
  }

  protected override void InitSkin( )
  {
   Console.WriteLine(Rece.Name);
  }
 }

 class Rece
 {
  public string Name { get; set; }
 }

  運行該示例,會出現(xiàn)NullReferenceException:未將對象引用設(shè)置到對象的實例。

  在調(diào)用代碼中,需要創(chuàng)建一個Chinese的實例對象chinese。由于Chinese類型有基類Person,所以運行時首先調(diào)用基類的構(gòu)造方法。在基類的構(gòu)造方法中,構(gòu)造函數(shù)會調(diào)用InitSkin虛方法。在程序運行時,調(diào)用的是子類的InitSkin方法。在子類的InitSkin方法中又在使用子類的Rece變量。但這個時候,子類的構(gòu)造函數(shù)還沒調(diào)用,因此Rece變量未實例化,但是InitSkin方法又在使用Rece變量,導(dǎo)致錯誤。

5、成員應(yīng)優(yōu)先考慮公開的基類型或接口

  類型成員在優(yōu)先考慮公開基類型或接口,會使得類型支持更多的應(yīng)用場合。

  FCL中的集合類型根據(jù)功能劃分有List<T>、Dictionary<TKey, TValue>、HashSet<T>等。例如,需要清空集合中的元素,返回空集合的方法Empty,如果不返回基類型或者接口的情況下,就要求我們?yōu)槊總€集合類型都實現(xiàn)該方法。但是,在FCL中實現(xiàn)了一個靜態(tài)類型Enumerable,代碼如下:

 public static IEnumerable<TResult> Empty<TResult>()
 {
  return EmptyEnumerable<TResult>.Instance;
 }

  使用了泛型接口IEnumerable,所以所有集合子類都可以不實現(xiàn)自己的Empty方法,做到項目的靈活應(yīng)用。

6、重寫時不應(yīng)使用子類參數(shù)

  重寫時,如果使用了子類參數(shù),可能會偏離設(shè)計者的預(yù)期目標。

  如存在以下繼承體系:

class Employee
{
}

class Manager:Employee
{
}

class Salary
{
 public void SetSalary(Employee e)
 {
  Console.WriteLine("職員被設(shè)置了薪水。");
 }
}  

class ManagerSalary:Salary
{
 public void SetSalary(Manager e)
 {
  Console.WriteLine("經(jīng)理被設(shè)置了薪水。");
 }
}

  類型ManagerSalary中的SetSalary方法重寫了Salary中的相同方法,但是參數(shù)采用了一個子類的參數(shù)?,F(xiàn)在在程序中調(diào)用代碼如下:

public static void Main()
{
 ManagerSalary m = new ManagerSalary();
 m.SetSalary(new Employee());
}

  設(shè)計者的本意時為經(jīng)理設(shè)置對應(yīng)的薪水,但是實際調(diào)用的代碼卻設(shè)置了員工的薪水。因此,在重寫時使用子類參數(shù)有一定的風(fēng)險。正確的方法時仍舊使用Employee類型參數(shù),讓編譯器提醒我們要使用關(guān)鍵字new。

以上就是c# 字段和方法設(shè)計建議的詳細內(nèi)容,更多關(guān)于c# 字段和方法的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • C# 正則表達式常用的符號和模式解析(最新推薦)

    C# 正則表達式常用的符號和模式解析(最新推薦)

    這篇文章主要介紹了C# 正則表達式常用的符號和模式解析,本文結(jié)合實例代碼給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-12-12
  • C#訪問SQL Server數(shù)據(jù)庫的實現(xiàn)方法

    C#訪問SQL Server數(shù)據(jù)庫的實現(xiàn)方法

    這篇文章主要介紹了C#訪問SQL Server數(shù)據(jù)庫的實現(xiàn)方法,以實例形式簡單分析了C#連接、查詢SQL Server數(shù)據(jù)庫的具體技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-10-10
  • WPF使用FontAwesome字體圖標

    WPF使用FontAwesome字體圖標

    這篇文章介紹了在WPF中使用FontAwesome字體圖標的方法,文中通過示例代碼介紹的非常詳細。對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-06-06
  • 舉例說明Java多線程編程中讀寫鎖的使用

    舉例說明Java多線程編程中讀寫鎖的使用

    這篇文章主要介紹了舉例說明Java多線程編程中讀寫鎖的使用,文中的例子很好地說明了Java的自帶讀寫鎖ReentrantReadWriteLock的使用,需要的朋友可以參考下
    2016-02-02
  • C#實現(xiàn)UI控件輸出日志的方法詳解

    C#實現(xiàn)UI控件輸出日志的方法詳解

    一般情況下,我們的日志文件是用來記錄一些關(guān)鍵操作或者異常,并且是后臺存儲,并不對外開放的,但是也有些時候,需要將一些操作步驟、記錄等直接顯示在窗體上。本文就將利用UI控件輸出日志效果,需要的可以參考一下
    2022-10-10
  • C#結(jié)合JavaScript實現(xiàn)手寫板簽名效果

    C#結(jié)合JavaScript實現(xiàn)手寫板簽名效果

    這篇文章主要為大家詳細介紹了C#如何結(jié)合JavaScript實現(xiàn)手寫板寫字并上傳到服務(wù)器進行處理,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2024-04-04
  • C#中的多播委托和泛型委托

    C#中的多播委托和泛型委托

    這篇文章介紹了C#中的多播委托和泛型委托,文中通過示例代碼介紹的非常詳細。對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-05-05
  • C#調(diào)用C++DLL傳遞結(jié)構(gòu)體數(shù)組的終極解決方案

    C#調(diào)用C++DLL傳遞結(jié)構(gòu)體數(shù)組的終極解決方案

    這篇文章主要介紹了C#調(diào)用C++DLL傳遞結(jié)構(gòu)體數(shù)組的終極解決方案的相關(guān)資料,需要的朋友可以參考下
    2017-01-01
  • c#?使用線程對串口serialPort進行收發(fā)數(shù)據(jù)(四種)

    c#?使用線程對串口serialPort進行收發(fā)數(shù)據(jù)(四種)

    本文主要介紹了c#?使用線程對串口serialPort進行收發(fā)數(shù)據(jù),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-07-07
  • C#實現(xiàn)加密exe文件

    C#實現(xiàn)加密exe文件

    這篇文章主要為大家詳細介紹了C#如何實現(xiàn)加密exe文件的功能,文中的示例代碼講解詳細,對我們學(xué)習(xí)C#有一定的幫助,感興趣的小伙伴可以跟隨小編一起了解一下
    2023-01-01

最新評論

大厂| 清河县| 乌鲁木齐市| 武功县| 三门峡市| 洪泽县| 安宁市| 永定县| 扶风县| 柳河县| 荆州市| 沾益县| 扎囊县| 博客| 平潭县| 会东县| 丘北县| 循化| 雷州市| 祥云县| 娄底市| 海丰县| 耒阳市| 武穴市| 建始县| 祁东县| 泰州市| 翼城县| 肃北| 凤山市| 叶城县| 芷江| 泾阳县| 龙海市| 柳林县| 麟游县| 祁门县| 临安市| 朝阳区| 平昌县| 都昌县|