程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#入門知識 >> 講授C#面絕對象編程中的類與對象的特征與概念

講授C#面絕對象編程中的類與對象的特征與概念

編輯:C#入門知識

講授C#面絕對象編程中的類與對象的特征與概念。本站提示廣大學習愛好者:(講授C#面絕對象編程中的類與對象的特征與概念)文章只能為提供參考,不一定能成為您想要的結果。以下是講授C#面絕對象編程中的類與對象的特征與概念正文



“類”是一種結構,經由過程應用該結構,您可以將其他類型的變量、辦法和事宜組合在一路,從而創立本身的自界說類型。類就像一個藍圖,它界說類型的數據和行動。假如類沒有聲明為靜態類,客戶端代碼便可以創立賦給變量的“對象”或“實例”,從而應用該類。在對變量的一切援用都超越規模之前,該變量一直堅持在內存中。一切援用都超越規模時,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();
  }
}

輸入:

unknown
John Smith
Sarah 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 辦法可以供給針對您的類型的高效求等算法。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved