1. 程式人生 > >二:物件和型別

二:物件和型別

類和結構

  • 類是存在在堆上,結構是儲存在棧上
  • 類可以繼承,結構不能繼承
  • 類的定義是class,結構是struct
  • 結構的效能要比類好,類的用處要比結構大

類的成員可訪問符public,protected,internal,internal protected,private

類的成員

  • 資料成員:欄位,常量,事件
  • 函式成員:提供了操作類的資料的功能,包括方法,屬性,構造器,終接器,運算子和索引器。

靜態建構函式

特徵:只執行一次,建構函式執行的時間不確定,不同的靜態建構函式順序也就不確定。靜態建構函式沒有修飾符,因為C#程式碼不呼叫它,而是又.NET執行庫呼叫。

使用靜態建構函式的原因:類的一些靜態欄位或屬性,需要在第一次使用之前,從外部初始化。

靜態建構函式使用的示例

using System;

namespace TestStaticConstructer
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine(UserInterface.BackColor);
            Console.ReadLine();
        }
    }

    
class UserInterface { public static readonly Color BackColor; static UserInterface() { DateTime dt = DateTime.Now; if ((dt.DayOfWeek == DayOfWeek.Sunday) || (dt.DayOfWeek == DayOfWeek.Saturday)) BackColor = Color.Green;
else BackColor = Color.Red; } } enum Color { Green, Red, Yellow } }
View Code

只讀欄位

只讀欄位readonly和const的區別,readonly在類初始化之前不知道值,二const在一開始就已經確定了值。如pi的定義使用const。

匿名型別

            var v1 = new { Name = "N1", Address = "A1" };
            var v2 = new { Name = "N2", Address = "A2" };
            var v3 = new { Name = "N3", address = "A3" };
            Console.WriteLine(v1.Name + "-" + v1.Address);
            Console.WriteLine(v1.GetType() == v2.GetType());
            Console.WriteLine(v1.GetType() == v3.GetType());

執行的結果如下

結構

先定義一個結構

    struct Student
    {
        public string Name;
    }

測試結構

        static void TestStruct()
        {
            Student s1 = new Student();
            s1.Name = "Test";
            Student s2;
            s2 = s1;
            Console.WriteLine(s1.Name+"-"+s2.Name);
            s2.Name = "New Name";
            Console.WriteLine(s1.Name + "-" + s2.Name);
        }

這個示例可以看出類和結構的差別,如果是類,s2=s1這句話就意味著兩個類是同一個類,地址相同,修改任何一個變數的值另外一個也會跟著一起改變。

總結:結構是值型別,類是引用型別。

結構沒有繼承,唯一的例外是基類是System.Object,這意味著可以用Object類接收一個結構

弱引用

相對於正常的類,主要在作用域內記憶體就不會被回收。弱型別是隻要執行垃圾回收器,就會被釋放記憶體。用處是在佔用記憶體很大,又不經常用的情況。

(個人感覺沒啥用)

部分類

partial關鍵字允許把類的定義放在多個檔案中。partial可以修飾類,介面,結構。

    partial class PartClass
    {
        public string FirstName;
        public void FirstFunction()
        {

        }
    }
    partial class PartClass
    {
        public string LastName;
    }

只要引用了這兩個部分類的名稱空間,兩個部分類中定義的成員都可以使用。

靜態類

static的類,不能例項化,直接使用

Object類

所有的類的最終基類都是Sytem.Object。

該類的方法有ToString(),GetHashCode(),Equals(),Finalize(),GetType(),MemberwiseClone();

拓展方法

如果一個類已經封閉,或者是一個外部元件的類不能修改。新增方法的方法是使用拓展方法。