第3章 對象和類型

1. 類和結構數組

2. 類數據結構

類包括成員,成員能夠是靜態或實例成員。
靜態成員屬於類;實例成員屬於對象。
靜態字段的值對每一個對象都是相同的;每一個對象的實例字段均可以有不一樣的值。函數

成員種類包括字段,常量,方法,屬性,構造函數,索引器(容許對象用訪問數組的方式訪問),運算符,事件,析構函數,類型(類能夠包含內部類)。ui

 

 

3. 結構this

 4.按值和按引用傳遞參數spa

  • 按值傳遞:方法中的變量a獲得堆棧中變量a1的一個副本。在方法最後修改、銷燬副本a,a1的內容從不改變。
  • 按引用傳遞:方法中的變量a把堆上的同一個對象引用爲變量a1。當方法中修改a,則a1內容改變,由於它們是同一個對象。

 (1) ref參數指針

  • 經過引用傳遞結構:若是A是結構類型,添加ref參數引用傳遞變量;在調用端也添加ref參數。
  • 類類型使用ref:傳遞對引用的引用(在C++術語中,即一個指向指針的指針),容許分配一個新對象。
  • 變量必須在傳遞給方法以前初始化。

(2) out參數code

      

5.可空類型對象

前提:引用類型的變量能夠爲空null,而值類型的變量不能。所以C#採用可空類型(類型後加?)定義能夠爲空的值類型。blog

類型與可空類型的轉換:使用可空類型的HasValue和Value屬性。

  • HasValue返回true或false,取決於可空類型是否有值。
  • Value返回底層的值。 
1 int? x1 = 1;          //可空類型 2 int  x2 = x1.HasValue ? x1.Value : -1;
3 int  x3 = x1 ?? -1;   //合併操做符

 6.枚舉:是值類型,包含一組命名的常量。

  • enum默認類型是int,可改成其餘整型類型(byte、short、int、long和無符號變量);從0開始遞增,能夠改成其餘值。
  • 使用強制類型轉換,將數字改成枚舉,把枚舉改成數字。
  • 使用Enum.TryParse<T>()泛型方式得到枚舉值
  • 使用Enum.GetNames(typeof(枚舉))遍歷全部枚舉名
  • 使用Enum.GetValues(typeof(枚舉))遍歷全部枚舉值
  • 能夠把多個選項分配給一個變量。
    • 要求常量值爲不一樣的位,可採用十六進制0x指定不一樣的位。
    • 使用Flags屬性,即「指示能夠將枚舉做爲位域(即一組標誌)處理」
    // 結合單個位來包括多個值
    [Flags]
    public enum DaysOfWeek
    {
        Monday = 0x1,
        Tuesday = 0x2,
        Wednesday = 0x4,
        Thursday = 0x8,
        Friday = 0x10,
        Saturday = 0x20,
        Sunday = 0x40,
        Weekend = Saturday | Sunday,
        Workday = 0x1f,
        AllWeek = Workday | Weekend
    }

    // 可使用邏輯或運算符爲一個變量指定多個值
    DaysOfWeek mondayAndWednesday = DaysOfWeek.Monday | DaysOfWeek.Wednesday;
    WriteLine(mondayAndWednesday);
    DaysOfWeek weekend = DaysOfWeek.Saturday | DaysOfWeek.Sunday;
    WriteLine(weekend);
    DaysOfWeek workday = DaysOfWeek.Monday | DaysOfWeek.Tuesday | DaysOfWeek.Wednesday | DaysOfWeek.Thursday | DaysOfWeek.Friday;
    WriteLine(workday);

 運行結果爲:

 

7. 部分類

  • partial關鍵字容許把類、結構、方法或接口放在多個文件中。
  • partial放在class、struct或interface 關鍵字的前面
  • 編譯時會將全部部分類合併爲一個類,屬性、XML註釋、接口、泛型類型的參數屬性和成員均會合並。
  • 部分類中能夠包括部分方法
    • 部分方法能夠在部分類中進行聲明,不須要實現。
    • 部分方法的實現,能夠放在部分類的任何其餘地方。
    • 部分方法未實現,編譯器將刪除這個方法的調用。
    • 部分方法必須是void

8. 擴展方法:給對象添加功能的一種方法之一,在不能使用繼承時可採用(如類是密封的)

  • 必須是靜態方法,它是類的一部分,可是沒有放在類的源代碼中
  • 使用this關鍵字和第一個參數來擴展,第一個參數定義了擴展的類型
// 擴展方法:統計字符串單詞個數
public static class StringExtensions
{
      public static int GetWordCount(this string s) =>
                s.Split().Length;
            
}

// 使用擴展方法
string fox = "the quick brown fox jumped over the lazy dogs down 9876543210 times";
int wordCount = fox.GetWordCount();
WriteLine($"{wordCount} words");

 9. Object類:提供公有的和受保護的成員方法

  • ToString()
  • GetHashCode():若對象放在名爲映射(也稱爲散列表或字典)的數據結構中,可以使用該方法肯定把對象放在結構的什麼地方。
  • Equals()(兩個版本)和ReferenceEquals()
  • Finalize():在引用對象做爲垃圾被回收以清理資源時調用。對未託管資源的引用被刪除時使用,通常要重寫。
  • GetType():提供對象成員所屬類的基本類型、方法、屬性等,以及.NET的反射技術的入口點。
  • MemberwiseClone():用於複製對象,並返回對副本的一個引用(對於值類型,就是一個裝箱的引用)。
相關文章
相關標籤/搜索