結構體和類同樣能夠定義字段,方法和構造函數,都能實例化對象,這樣看來結構體和類的功能好像是一樣的了,但是他們在數據的存儲上是不一樣的(以下摘錄):
C#結構體和類的區別問題:在C#編程語言中,類屬於引用類型的數據類型,結構體屬於值類型的數據類型,這兩種數據類型的本質區別主要是各自指向的內存位置不同。傳遞類的時候,主要表現為是否同時改變了源對象。
C#結構體和類的區別技術要點:
◆類在傳遞的時候,傳遞的內容是位於托管內存中的位置,結構體在傳遞的時候,傳遞的內容是位於程序堆棧區的內容。當類的傳遞對象修改時,將同時修改源對象,而結構體的傳遞對象修改時,不會對源對象產生影響。
◆在一個類中,可以定義默認的、不帶參數的構造函數,而在結構體中不能定義默認的、不帶參數的構造函數。兩者都可以定義帶有參數的構造函數,通過這些參數給各自的字段賦值或初始化
代碼運行如下:類中賦值以后,兩個對象中的值都發生變化,而結構體原來對象的值為發生變化
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace 類對象 { //枚舉 public enum Gender { 男, 女 } //結構體 public struct stuPerson { public string stuName; public int stuAge; public Gender stuSex; public void stuSayHello() { Console.WriteLine("我是{0},年齡{1},性別{2}", stuName, stuAge, stuSex); } //必須定義有參數的構造函數 public stuPerson(string name, int age, Gender sex) { this.stuName = name; this.stuAge = age; this.stuSex = sex; } } class Program { static void Main(string[] args) { //實例化類 Person Liuxiang = new Person(); //無參數的構造函數實例化的對象 Liuxiang.Name = "劉翔"; Liuxiang.Age = 30; Liuxiang.Sex = Gender.男; Liuxiang.SayHello(); //聲明另一個實例 Person LXSon = Liuxiang; LXSon.Age = 10; //查看類 LiuXiang 和 LXSon中字段的值 Console.WriteLine("LiuXiang 年齡{0}", Liuxiang.Age.ToString()); //10 Console.WriteLine("LXSon 年齡{0}", LXSon.Age.ToString()); //10 Console.WriteLine(); //結構體 stuPerson YaoMing = new stuPerson("姚明",33,Gender.男); YaoMing.stuSayHello(); stuPerson YMSon = YaoMing; YMSon.stuAge = 13; //查看結構體中 YaoMing 和 YMSon中字段的值 Console.WriteLine("YaoMing 年齡{0}", YaoMing.stuAge.ToString()); //10 Console.WriteLine("YMSon 年齡{0}", YMSon.stuAge.ToString()); //10 Console.ReadLine(); } } class Person { //定義字段 public string Name; public int Age; public Gender Sex; //定義方法 public void SayHello() { Console.WriteLine("我是{0},年齡{1},性別{2}", this.Name, this.Age, this.Sex); } //無參數的構造函數 public Person() { } //有參數的構造函數 public Person(string name, int age, Gender sex) { this.Name = name; this.Age = age; this.Sex = sex; } } }