亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

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

 更新時間:2016年01月28日 16:00:45   投稿:goldensun  
這篇文章主要介紹了C#面相對象編程中的類與對象的特性與概念,OOP面向?qū)ο笳Z言相對C語言這樣面相過程的語言來說具有類和對象以及方法這樣的特性,需要的朋友可以參考下


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

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

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

Customer object1 = new Customer();

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

Customer object2;

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

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

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

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

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

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();
  }
}

輸出:

unknown
John Smith
Sarah Jones

對象
類或結(jié)構(gòu)定義的作用類似于藍圖,指定該類型可以進行哪些操作。從本質(zhì)上說,對象是按照此藍圖分配和配置的內(nèi)存塊。程序可以創(chuàng)建同一個類的多個對象。對象也稱為實例,可以存儲在命名變量中,也可以存儲在數(shù)組或集合中。使用這些變量來調(diào)用對象方法及訪問對象公共屬性的代碼稱為客戶端代碼。在 C# 等面向?qū)ο蟮恼Z言中,典型的程序由動態(tài)交互的多個對象組成。

結(jié)構(gòu)實例。. 選件類實例
由于類是引用類型,因此類對象的變量引用該對象在托管堆上的地址。如果將同一類型的第二個對象分配給第一個對象,則兩個變量都引用該地址的對象。這一點將在本主題后面部分進行更詳細的討論。
類的實例是使用 new 運算符創(chuàng)建的。在下面的示例中,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

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

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 的內(nèi)存在線程堆棧上進行分配。該內(nèi)存隨聲明它的類型或方法一起回收。這就是在賦值時復(fù)制結(jié)構(gòu)的一個原因。相比之下,當(dāng)對類實例對象的所有引用都超出范圍時,為該類實例分配的內(nèi)存將由公共語言運行時自動回收(垃圾回收)。無法像在 C++ 中那樣明確地銷毀類對象。

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

// 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 實現(xiàn)使用反射,因為它必須能夠確定任何結(jié)構(gòu)中有哪些字段。在創(chuàng)建您自己的結(jié)構(gòu)時,重寫 Equals 方法可以提供針對您的類型的高效求等算法。

相關(guān)文章

  • C#中Task.Yield的用途深入講解

    C#中Task.Yield的用途深入講解

    這篇文章主要給大家介紹了關(guān)于C#中Task.Yield的用途的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2018-11-11
  • unity實現(xiàn)貼圖矩陣運算(旋轉(zhuǎn)平移縮放)

    unity實現(xiàn)貼圖矩陣運算(旋轉(zhuǎn)平移縮放)

    這篇文章主要為大家詳細介紹了unity實現(xiàn)貼圖矩陣運算,旋轉(zhuǎn)平移縮放,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-07-07
  • C#實現(xiàn)多線程的同步方法實例分析

    C#實現(xiàn)多線程的同步方法實例分析

    這篇文章主要介紹了C#實現(xiàn)多線程的同步方法,實例分析了C#線程同步的實現(xiàn)技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-04-04
  • C#多線程之Semaphore用法詳解

    C#多線程之Semaphore用法詳解

    這篇文章主要為大家詳細介紹了C#多線程之Semaphore用法,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-08-08
  • C#委托與事件原理及實例解析

    C#委托與事件原理及實例解析

    這篇文章主要介紹了C#委托與事件原理及實例解析,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-12-12
  • C#中Razor模板引擎簡單使用

    C#中Razor模板引擎簡單使用

    Razor 是一種標記語法,可以讓您將基于服務(wù)器的代碼(Visual Basic 和 C#)嵌入到網(wǎng)頁中,本文給大家介紹了C#中Razor模板引擎簡單使用,需要的朋友可以參考下
    2022-02-02
  • C#中實現(xiàn)插入、刪除Excel分頁符的方法

    C#中實現(xiàn)插入、刪除Excel分頁符的方法

    這篇文章主要給大家介紹了關(guān)于在C#中實現(xiàn)插入、刪除Excel分頁符的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2018-05-05
  • c#使用linq技術(shù)創(chuàng)建xml文件的小例子

    c#使用linq技術(shù)創(chuàng)建xml文件的小例子

    c#使用linq技術(shù)創(chuàng)建xml文件的小例子,需要的朋友可以參考一下
    2013-03-03
  • C#(int)中Convert、Parse、TryParse的區(qū)別

    C#(int)中Convert、Parse、TryParse的區(qū)別

    Convert.ToInt32、int.Parse(Int32.Parse)、int.TryParse、(int) 四者都可以解釋為將類型轉(zhuǎn)換為 int,那它們的區(qū)別是什么呢?
    2013-04-04
  • C#線程 BeginInvoke和EndInvoke使用方法

    C#線程 BeginInvoke和EndInvoke使用方法

    本文開始C#線程系列講座之一,即BeginInvoke和EndInvoke的使用方法,需要的朋友可以參考下
    2013-05-05

最新評論