C#結構體和類的區別淺析
C#結構體和類的區別問題:在C#編程語言中,類屬于引用類型的數據類型,結構體屬于值類型的數據類型,這兩種數據類型的本質區別主要是各自指向的內存位置不同。傳遞類的時候,主要表現為是否同時改變了源對象。
C#結構體和類的區別技術要點:
◆類在傳遞的時候,傳遞的內容是位于托管內存中的位置,結構體在傳遞的時候,傳遞的內容是位于程序堆棧區的內容。當類的傳遞對象修改時,將同時修改源對象,而結構體的傳遞對象修改時,不會對源對象產生影響。
◆在一個類中,可以定義默認的、不帶參數的構造函數,而在結構體中不能定義默認的、不帶參數的構造函數。兩者都可以定義帶有參數的構造函數,通過這些參數給各自的字段賦值或初始化。
C#結構體和類的區別之實現步驟
(1)創建控制臺應用程序項目,命名為“ClassAndStruct”。
(2)打開并編輯Program.cs文件,代碼如下所示。
- using System; //C#結構體和類的區別
- using System.Collections.Generic;
- using System.Text;
- namespace ClassAndStruct
- {
- class Program
- {
- static void Main(string[] args)
- {
- //使用帶參數的構造函數創建員工類的實例
- classEmployee clsEmpA = new
- classEmployee("Pony","Smith",43);
- classEmployee clsEmpB = clsEmpA;
- //修改引用數據
- clsEmpB.Age = 33;
- //使用帶參數的構造函數創建員工結構體的實例
- structEmployee strctEmpA =
- new structEmployee("Pony", "Smith", 43);
- structEmployee strctEmpB = strctEmpA;
- //修改
- strctEmpB.Age = 33;
- Console.WriteLine("類的數據:姓名-{0} {1} 年齡-{2}",
- clsEmpA.FirstName,clsEmpA.LastName,clsEmpA.Age);
- Console.WriteLine("結構體的數據:姓名-{0} {1} 年齡-{2}",
- strctEmpA.FirstName, strctEmpA.LastName, strctEmpA.Age);
- Console.ReadLine();
- }
- }
- class classEmployee//表示員工的類
- {
- private string firstname;
- public string FirstName
- {
- get { return firstname; }
- set { firstname = value; }
- }
- private string lastname;
- public string LastName
- {
- get { return lastname; }
- set { lastname = value; }
- }
- private int age;
- public int Age
- {
- get { return age; }
- set { age = value; }
- }
- //類的默認構造函數,可以在類中重新定義
- public classEmployee()
- {
- firstname = "";
- lastname = "";
- age = 0;
- }
- //C#結構體和類的區別
- //類的帶參數的構造函數,在構造類實例的同時給字段賦值
- public classEmployee(
- string strFirstNamem, string strLastName, int iAge)
- {
- firstname = strFirstNamem;
- lastname = strLastName;
- age = iAge;
- }
- }
- struct structEmployee//表示員工的結構體
- {
- private string firstname;
- public string FirstName
- {
- get { return firstname; }
- set { firstname = value; }
- }
- private string lastname;
- public string LastName
- {
- get { return lastname; }
- set { lastname = value; }
- }
- //C#結構體和類的區別
- private int age;
- public int Age
- {
- get { return age; }
- set { age = value; }
- }
- //在結構體中不能定義默認的不帶參數的構造函數,只能定義結構體的帶參數的構造函數
- public structEmployee(string strFirstNamem,
- string strLastName, int iAge)
- {
- firstname = strFirstNamem;
- lastname = strLastName;
- age = iAge;
- }
- }
- }
(3)按F5鍵運行程序,運行結果如下所示。
類的數據:姓名-Pony Smith 年齡-33
結構體的數據:姓名-Pony Smith 年齡-43
C#結構體和類的區別之源程序解讀
(1)本示例為了說明在傳遞時C#結構體和類的區別,在程序中分別定義了表示員工的類classEmployee類和表示員工的結構體structEmployee,并定義了各自的字段和構造函數。在主程序入口Main方法中,聲明類的實例clsEmpA和clsEmpB,并使用構造函數創建clsEmpA類實例,然后將clsEmpA類實例傳遞給clsEmpB類實例,修改clsEmpB類實例的字段值,最后打印clsEmpA類實例中的字段,查看字段的值是否隨clsEmpB類實例字段的修改而變化。同時,聲明結構體的實例strctEmpA和strctEmpB,并使用構造函數創建strctEmpA結構體實例,然后將strctEmpA結構體實例傳遞給strctEmpB結構體實例,修改strctEmpB結構體實例的字段值,最后打印strctEmpA結構體實例中的字段,查看字段的值是否隨strctEmpB結構體實例字段的修改而變化。程序的流程圖如圖8.1所示。
(2)C#結構體和類的區別還有一個比較明顯的區別,就是類能夠定義默認的、不帶參數的構造函數,并能在該構造函數中初始化字段。而結構體不允許定義默認的、不帶參數的構造函數。
C#結構體和類的區別的相關內容就向你介紹到這里,希望對你學習和了解C#結構體和類的區別有所幫助。
【編輯推薦】