亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C# > 正文

講解C#面相對象編程中的類與對象的特性與概念

2020-01-24 01:18:53
字體:
來源:轉載
供稿:網友


“類”是一種構造,通過使用該構造,您可以將其他類型的變量、方法和事件組合在一起,從而創建自己的自定義類型。類就像一個藍圖,它定義類型的數據和行為。如果類沒有聲明為靜態類,客戶端代碼就可以創建賦給變量的“對象”或“實例”,從而使用該類。在對變量的所有引用都超出范圍之前,該變量始終保持在內存中。所有引用都超出范圍時,CLR 將標記該變量以供垃圾回收。如果類聲明為靜態類,則內存中只存在一個副本,并且客戶端代碼只能通過該類自身而不是“實例變量”訪問該類。
聲明類
類使用 class 關鍵字進行聲明,如下面的示例所示:

public class Customer{  //Fields, properties, methods and events go here...}

class 關鍵字前面是訪問級別。由于在該例中使用 public,因此任何人都可以基于該類創建對象。類的名稱位于 class 關鍵字的后面。定義的其余部分是類的主體,用于定義行為和數據。類的字段、屬性、方法和事件統稱為“類成員”。
創建對象
盡管有時類和對象可互換,但它們是不同的概念。類定義對象的類型,但它不是對象本身。對象是基于類的具體實體,有時稱為類的實例。
通過使用 new 關鍵字(后跟對象將基于的類的名稱)可以創建對象,如下所示:

Customer object1 = new Customer();

創建類的實例后,將向程序員傳遞回對該對象的引用。在前面的示例中,object1 是對基于 Customer 的對象的引用。此引用引用新對象,但不包含對象數據本身。實際上,可以在根本不創建對象的情況下創建對象引用:

Customer object2;

建議不要創建像這樣的不引用對象的對象引用,因為在運行時通過這樣的引用來訪問對象的嘗試將會失敗。但是,可以創建這樣的引用來引用對象,方法是創建新對象,或者將它分配給現有的對象,如下所示:

Customer object3 = new Customer();Customer object4 = object3;

此代碼創建了兩個對象引用,它們引用同一個對象。因此,通過 object3 對對象所做的任何更改都將反映在隨后使用的 object4 中。由于基于類的對象是按引用來引用的,因此類稱為引用類型。
類繼承
繼承是通過使用“派生”來實現的,而派生意味著類是使用“基類”聲明的,它的數據和行為從基類繼承。通過在派生的類名后面追加冒號和基類名稱,可以指定基類,如下所示:

public class Manager : Employee{  // Employee fields, properties, methods and events are inherited  // New Manager fields, properties, methods and events go here...}

當類聲明基類時,它繼承基類除構造函數以外的所有成員。
與 C++ 不同,C# 中的類只能直接從一個基類繼承。但是,因為基類自身也可能繼承自另一個類,所以類可以間接繼承多個基類。而且,一個類可以直接實現一個以上的接口。
類可以聲明為抽象類。抽象類包含具有簽名定義但沒有實現的抽象方法。抽象類不能進行實例化。只能通過實現抽象方法的派生類使用抽象類。相比之下,密封類不允許其他類從其派生。
類定義可在不同的源文件之間進行拆分。
描述
下面的示例中定義了一個公共類,其中包含一個字段、一個方法和一個稱為構造函數的特殊方法。有關更多信息,請參見構造函數(C# 編程指南)。然后使用 new 關鍵字將該類實例化。

public class Person{  // Field  public string name;  // Constructor that takes no arguments.  public Person()  {    name = "unknown";  }  // Constructor that takes one argument.  public Person(string nm)  {    name = nm;  }  // Method  public void SetName(string newName)  {    name = newName;  }}class TestPerson{  static void Main()  {    // Call the constructor that has no parameters.    Person person1 = new Person();    Console.WriteLine(person1.name);    person1.SetName("John Smith");    Console.WriteLine(person1.name);    // Call the constructor that has one parameter.    Person person2 = new Person("Sarah Jones");    Console.WriteLine(person2.name);    // Keep the console window open in debug mode.    Console.WriteLine("Press any key to exit.");    Console.ReadKey();  }}

輸出:

unknownJohn SmithSarah Jones

對象
類或結構定義的作用類似于藍圖,指定該類型可以進行哪些操作。從本質上說,對象是按照此藍圖分配和配置的內存塊。程序可以創建同一個類的多個對象。對象也稱為實例,可以存儲在命名變量中,也可以存儲在數組或集合中。使用這些變量來調用對象方法及訪問對象公共屬性的代碼稱為客戶端代碼。在 C# 等面向對象的語言中,典型的程序由動態交互的多個對象組成。

結構實例。. 選件類實例
由于類是引用類型,因此類對象的變量引用該對象在托管堆上的地址。如果將同一類型的第二個對象分配給第一個對象,則兩個變量都引用該地址的對象。這一點將在本主題后面部分進行更詳細的討論。
類的實例是使用 new 運算符創建的。在下面的示例中,Person 為類型,person1 和 person 2 為該類型的實例(即對象)。

public class Person{  public string Name { get; set; }  public int Age { get; set; }  public Person(string name, int age)  {    Name = name;    Age = age;  }  //Other properties, methods, events...}class Program{  static void Main()  {    Person person1 = new Person("Leopold", 6);    Console.WriteLine("person1 Name = {0} Age = {1}", person1.Name, person1.Age);    // Declare new person, assign person1 to it.    Person person2 = person1;    //Change the name of person2, and person1 also changes.    person2.Name = "Molly";    person2.Age = 16;    Console.WriteLine("person2 Name = {0} Age = {1}", person2.Name, person2.Age);    Console.WriteLine("person1 Name = {0} Age = {1}", person1.Name, person1.Age);    // Keep the console open in debug mode.    Console.WriteLine("Press any key to exit.");    Console.ReadKey();  }}

輸出:

  person1 Name = Leopold Age = 6  person2 Name = Molly Age = 16  person1 Name = Molly Age = 16

由于結構是值類型,因此結構對象的變量具有整個對象的副本。結構的實例也可以使用 new 運算符來創建,但這不是必需的,如下面的示例所示:

public struct Person{  public string Name;  public int Age;  public Person(string name, int age)  {    Name = name;    Age = age;  }}public class Application{  static void Main()  {    // Create struct instance and initialize by using "new".    // Memory is allocated on thread stack.    Person p1 = new Person("Alex", 9);    Console.WriteLine("p1 Name = {0} Age = {1}", p1.Name, p1.Age);    // Create new struct object. Note that struct can be initialized    // without using "new".    Person p2 = p1;    // Assign values to p2 members.    p2.Name = "Spencer";    p2.Age = 7;    Console.WriteLine("p2 Name = {0} Age = {1}", p2.Name, p2.Age);    // p1 values remain unchanged because p2 is copy.    Console.WriteLine("p1 Name = {0} Age = {1}", p1.Name, p1.Age);    // Keep the console open in debug mode.    Console.WriteLine("Press any key to exit.");    Console.ReadKey();  }}

輸出:

  p1 Name = Alex Age = 9  p2 Name = Spencer Age = 7  p1 Name = Alex Age = 9

p1 和 p2 的內存在線程堆棧上進行分配。該內存隨聲明它的類型或方法一起回收。這就是在賦值時復制結構的一個原因。相比之下,當對類實例對象的所有引用都超出范圍時,為該類實例分配的內存將由公共語言運行時自動回收(垃圾回收)。無法像在 C++ 中那樣明確地銷毀類對象。

對象標識與. 值相等性
在比較兩個對象是否相等時,首先必須明確您是想知道兩個變量是否表示內存中的同一對象,還是想知道這兩個對象的一個或多個字段的值是否相等。如果您要對值進行比較,則必須考慮這兩個對象是值類型(結構)的實例,還是引用類型(類、委托、數組)的實例。
若要確定兩個類實例是否引用內存中的同一位置(意味著它們具有相同的標識),可使用靜態 Equals 方法。(System.Object 是所有值類型和引用類型的隱式基類,其中包括用戶定義的結構和類。)
若要確定兩個結構實例中的實例字段是否具有相同的值,可使用 ValueType.Equals 方法。由于所有結構都隱式繼承自 System.ValueType,因此可以直接在對象上調用該方法,如下面的示例所示:

// Person is defined in the previous example.//public struct Person//{//  public string Name;//  public int Age;//  public Person(string name, int age)//  {//    Name = name;//    Age = age;//  }//}Person p1 = new Person("Wallace", 75);Person p2;p2.Name = "Wallace";p2.Age = 75;if (p2.Equals(p1))  Console.WriteLine("p2 and p1 have the same values.");

輸出:

 p2 and p1 have the same values.

Equals 的 System.ValueType 實現使用反射,因為它必須能夠確定任何結構中有哪些字段。在創建您自己的結構時,重寫 Equals 方法可以提供針對您的類型的高效求等算法。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲欧美一区二区三区四区| 欧美有码在线观看| 久久精品小视频| 一级做a爰片久久毛片美女图片| 成人a在线观看| 精品久久久中文| 久久成年人视频| 精品欧美一区二区三区| 尤物精品国产第一福利三区| 国产精品女主播| 精品久久久久久电影| 琪琪亚洲精品午夜在线| 97国产真实伦对白精彩视频8| 亚洲欧洲在线播放| 国自在线精品视频| 国产精品久久久久久久9999| 成人精品视频久久久久| 国产成+人+综合+亚洲欧洲| 午夜欧美不卡精品aaaaa| 成人黄色av播放免费| 一本色道久久88综合亚洲精品ⅰ| 日韩美女写真福利在线观看| 日本一区二区在线免费播放| 国产极品精品在线观看| 亚洲男人的天堂在线播放| 久久久爽爽爽美女图片| 亚洲天堂男人天堂| 亚洲欧美另类自拍| 欧美特级www| 亚洲一区二区中文| 久久激情视频久久| 欧美福利视频在线观看| 国产精品第二页| 国产欧美日韩精品丝袜高跟鞋| 91视频88av| 懂色av影视一区二区三区| 在线a欧美视频| 日韩av在线天堂网| 亚洲国产精品成人va在线观看| 亚洲一区二区三区四区视频| 日本在线观看天堂男亚洲| 欧美一级电影久久| 欧美日韩性视频| 欧美精品久久久久久久久| 国产一级揄自揄精品视频| 亚洲国产精品va在线看黑人| 日韩欧美国产免费播放| 国产精品免费看久久久香蕉| 国产精自产拍久久久久久| 欧美黄色片免费观看| 日韩成人久久久| 国产日韩欧美中文在线播放| 欧美极品少妇xxxxⅹ喷水| 国产深夜精品福利| 亚洲国产精品99久久| 孩xxxx性bbbb欧美| 日韩一区二区福利| 青青久久av北条麻妃海外网| 亚洲人成啪啪网站| 国产97在线播放| 欧美激情国产日韩精品一区18| 亚洲电影在线观看| 在线成人免费网站| 456亚洲影院| 国产精品私拍pans大尺度在线| 国产精品日韩欧美大师| 不卡av电影院| 亚洲高清av在线| 亚洲精品成人久久久| 亚洲一区二区三区香蕉| 国产精品女人久久久久久| 亚洲成人精品在线| 日本精品免费观看| 欧美专区中文字幕| 日韩国产中文字幕| 狠狠爱在线视频一区| 亚洲欧洲中文天堂| 日韩av在线免费播放| 中文字幕亚洲欧美一区二区三区| 亚洲欧美激情精品一区二区| 久久精品视频99| 中文字幕精品国产| 欧美成人精品在线视频| 中文字幕日韩欧美| 国产欧美一区二区| 国产主播欧美精品| 久久久久国色av免费观看性色| 日韩大胆人体377p| 欧美一区二粉嫩精品国产一线天| 国外成人在线视频| 美女扒开尿口让男人操亚洲视频网站| 国产日韩精品在线播放| 日韩av日韩在线观看| 欧美伊久线香蕉线新在线| 97视频人免费观看| 日本一欧美一欧美一亚洲视频| 中文字幕日韩有码| 欧美高清不卡在线| 成人久久精品视频| 欧洲午夜精品久久久| 91在线免费观看网站| 亚洲乱码av中文一区二区| 国产精品久久久久久久天堂| 隔壁老王国产在线精品| 8x海外华人永久免费日韩内陆视频| 亚洲国产精品成人精品| 日本精品视频在线播放| 国产成人精品久久| 亚洲国产精品字幕| 国产在线观看91精品一区| 精品女厕一区二区三区| 国产suv精品一区二区三区88区| 国模吧一区二区| 欧美在线视频观看免费网站| 欧美极度另类性三渗透| 欧美大胆a视频| 日本高清视频一区| 九九久久久久99精品| 欧美日韩精品二区| 日本成人精品在线| 高清欧美性猛交| 成人精品网站在线观看| 亚洲香蕉在线观看| 日本成人在线视频网址| 亚洲97在线观看| 欧美成人精品在线播放| 日韩av黄色在线观看| 久久久精品免费视频| 欧美极品少妇xxxxx| 国内精品小视频| 国产成人久久久精品一区| 亚洲高清一区二| 91av在线国产| 日韩美女在线看| 日韩av色在线| 欧美有码在线观看| 国产亚洲激情视频在线| 国产精品视频yy9099| 国产精品久久久久久av下载红粉| 国产手机视频精品| 欧美国产视频一区二区| 亚洲精品午夜精品| 国产精品视频久久| 欧美大片免费看| 日本久久久久久久| 久久电影一区二区| 亚洲国产欧美一区二区三区久久| 亚洲午夜色婷婷在线| 欧美亚洲伦理www| 国产精品久久久久久亚洲影视| 国产情人节一区| 91精品在线一区| 国产精品精品视频一区二区三区| 国产91在线播放九色快色| 欧美一级视频免费在线观看| 在线视频国产日韩| 一级做a爰片久久毛片美女图片| 欧美影院成年免费版| xx视频.9999.com| 欧美激情乱人伦一区| 亚洲一区二区日本| 日韩精品在线免费观看视频| 欧美日韩国产精品一区| 亚洲天堂成人在线|