文章目錄
- 對象的概念
- 對象的創建和使用
- 匿名類型和初始化器
- 構造函數和析構函數
- 構造函數
- 析構函數
- 范例
- 參數傳遞
|
對象的概念
類是具有相同特征一類事物的抽象,而對象是類的實例。
類和對象有本質的區別,類是從對象中抽取出來的一類對象的描述,對象是類中的個體,是一個具體的事物,創建對象就是從抽象到具體的過程,是將類的屬性和行為實例化的過程。類與對象的關系可以比喻為設計手機和具體手機的關系,類就像手機機型設計一樣說明了手機所應該具備的所有屬性和功能,但是手機設計并不是手機;對象就是跟據手機設計而制造出來的手機,它具有手機的所有功能,能打電話發短信。
對象的創建和使用
類是抽象的,要使用類中非靜態的成員,就必須創建類的對象,創建對象就是類的實例化過程。
C#使用new運算符創建對象。
- 語法格式如下:
類名 對象名 = new 類名(參數列表);
其中,參數列表是可選的。
如創建Phone類的一個對象如下:class PhoneClass{public string brand;public string type;}class Program{static void Main(string[] args){PhoneClass Phone = new PhoneClass();//創建Phone類的一個對象Phone.brand = "huawei";Phone.type = "5G";Console.WriteLine("手機品牌是:" + Phone.brand);Console.WriteLine("手機種類是:" + Phone.type);Console.ReadKey();}}
對象的使用是通過訪問對象中的非靜態成員來實現的。
- 訪問對象中的非靜態成員語法如下:
對象名.成員名
如Phone類的一個對象的使用如下:
class PhoneClass{public string brand;public string type;}class Program{static void Main(string[] args){PhoneClass Phone = new PhoneClass();//創建Phone類的一個對象Phone.brand = "huawei";Phone.type = "5G";Console.WriteLine("手機品牌是:" + Phone.brand);//Phone對象的使用Console.WriteLine("手機種類是:" + Phone.type);//Phone對象的使用Console.ReadKey();}}
匿名類型和初始化器
匿名類型是C#3.0新增功能,能簡化對象的初始值設置。使用對象初始化,創建類的對象并對其屬性成員賦值。
舉例如下:PhoneClass Phone = new PhoneClass(){Phone.brand = "huawei"};
例如定義類Point,有兩個屬性X,Y表示點的坐標
public class Point //定義Point類{ // 類的屬性定義中set,get可以簡寫為以下形式 public double X { get; set; }//定義屬性X,點的橫坐標public double Y { get; set; }//定義屬性Y,點的縱坐標}
使用對象初始化,可以這樣創建對象并對屬性賦值
Point P = new Point() { X = 0.0, Y = 0.0 }; //創建對象P并對XY賦值
使用匿名類型可以定義內嵌的類型,不需要顯示的定義一個類型。假設沒有定義Point類,卻要使用一個Point的對象,可以使用對象初始化器,不用指定類名。
例如:var p = new { X = 0.0, Y = 0.0 }; //創建匿名類型p,并使用對象初始化器賦值。
構造函數和析構函數
對象和客觀世界的事物一樣,從創建到消亡都有一個生命周期,對象的創建和銷毀是通過類的構造函數和析構函數來完成的。
構造函數
構造函數是類的特殊方法成員,其名稱和類名相同,主要用來完成對象的初始化。
C#通過new創建對象的過程實際上就是調用類的構造函數的過程,創建對象時調用構造函數對對象進行初始化。每個類都有構造函數,如果沒有定義,系統也會提供一個默認的構造函數,默認的構造函數一般不進行什么操作。在訪問一個類的時候,系統最先執行構造函數中的語句。析構函數
析構函數是對象銷毀前釋放所占用的系統資源的類的成員。析構函數的名字是在類名前加一個“~”符號。析構函數不接受任何參數,也不返回任何值。
例如:public class Point //定義Point類{ // 類的屬性定義中set,get可以簡寫為以下形式 Point(){//構造函數 //構造函數內容}~Point() //析構函數名{//析構函數 //析構函數內容}public double X { get; set; }//定義屬性X,點的橫坐標public double Y { get; set; }//定義屬性Y,點的縱坐標}
范例
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks;namespace test {class Program{static void Main(string[] args){Point p1 = new Point();Console.WriteLine("無參數構造函數演示");Console.WriteLine("X:" + p1.X);Console.WriteLine("Y:" + p1.Y);Point p2 = new Point(2.0,3.0);Console.WriteLine("有參數構造函數演示");Console.WriteLine("X:" + p2.X);Console.WriteLine("Y:" + p2.Y);Console.ReadKey();}}public class Point //定義Point類{ // 類的屬性定義中set,get可以簡寫為以下形式 public Point(){X = 0.0; Y = 2.0;//構造函數 //構造函數內容}public Point(double x,double y){X = x; Y = y;//構造函數 //構造函數內容}~Point() //析構函數名{Console.WriteLine("清理資源");//析構函數 //析構函數內容}public double X { get; set; }//定義屬性X,點的橫坐標public double Y { get; set; }//定義屬性Y,點的縱坐標} }
運行結果:
參數傳遞
C#的許多方法成員是有參數的,定義方法時聲明的參數是形式參數,調用方法時要給形式參數傳值,傳遞方法的值是實參。C#有“值傳遞”和“引用傳遞”兩種傳遞參數類型。值傳遞是C#默認的傳遞方式,使用值傳遞方式時,向形式參數傳遞實在參數的副本,方法內發生的對形式參數的更改對實在參數本身沒有影響,就像文件的復印件一樣,無論如何修改復印件,原件沒有任何改變。如果希望所調用的方法能更改實在參數的值,則必須使用ref或out關鍵字聲明通過引用傳遞方式傳遞參數,引用傳遞是把實在參數的地址傳給形式參數,形式參數和實在參數指向同一個存儲單元,對形式參數的改變就是對實在參數的改變。out與ref類似,二者的區別是,ref要求參數在傳遞之間必須初始化,out則不要求初始化。
可參考文章:
C#的兩種類據類型:值類型和引用類型- 博主簡介:
- 工業自動化上位機軟件工程師、機器視覺算法工程師、運動控制算法工程師。目前從業于智能制造自動化行業。 博主郵箱:2296776525@qq.com
- 幫忙點個贊吧。哈哈。