C#:類和結構的區別

來源:互聯網
上載者:User

標籤:style   blog   color   使用   io   資料   cti   ar   

第一、參考型別和實值型別

類屬於參考型別,而結構屬於實值型別。

結構在賦值時進行複製。 將結構賦值給新變數時,將複製所有資料,並且對新副本所做的任何修改不會更改原始副本的資料。

 

第二、繼承性

類可以繼承類或者實現介面,而結構只能實現介面,不能繼承結構。

 

第三、執行個體化

類的執行個體化需要使用new關鍵字,但是結構的執行個體化則可以不使用new關鍵字。

 

第四、建構函式

類可以顯式地包含無參的建構函式,但是結構卻不可以顯式地包含無參建構函式,只可以定義帶有參數的建構函式。

 

第五、初始化執行個體欄位

類可以在類的定義中初始化執行個體欄位,但是結構不可以。

在結構聲明中,除非欄位被聲明為 const 或 static,否則無法初始化。

 

using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading.Tasks; using System.Collections;namespace ConsoleApplication{    class Program    {        static void Main(string[] args)        {            ClassPerson cp = new ClassPerson();            StructPerson sp = new StructPerson("Mary");            cp.ShowName();            sp.ShowName();            Console.ReadKey();        }    }    //可以繼承介面    public struct StructPerson:IShowName     {        private string name;        /// <summary>姓名</summary>        public string Name        {            get            {                return this.name;            }            set            {                this.name = value;            }        }        //可以顯式地包含帶有參數的建構函式        public StructPerson(string name)        {            this.name = name;        }        public void ShowName()        {            Console.WriteLine(this.Name);        }    }    //可以繼承介面和類    public class ClassPerson : Creature, IShowName    {        //可以在類的定義中初始化執行個體欄位        private string name="John";        /// <summary>姓名</summary>        public string Name        {            get            {                return this.name;            }            set            {                this.name = value;            }        }        //可以顯式地包含無參的建構函式        public ClassPerson()            :base()        {        }        public override void Move()        {            Console.WriteLine("Moving");        }        public void ShowName()        {            Console.WriteLine(this.Name);        }    }    public interface IShowName    {        void ShowName();    }    public abstract class Creature    {        public abstract void Move();    }}

 

最後注意以下幾點:

①在結構中初始化執行個體欄位 的方法:一是使用參數化建構函式,二是在聲明結構後分別訪問成員。 對於任何私人成員或以其他方式設定為不可訪問的成員,只能在建構函式中進行初始化。

②當不用new建立結構對象時需要注意,在初始化所有欄位之前,欄位將保持未賦值狀態,同時對象不可用。也就是說,在結構對象包含的所有欄位(包含私人的、公有的、隱藏的(自動實作屬性在運行時產生的))初始化之前,該結構對象中的方法或者屬性都不可以調用。

③當結構包含參考型別作為成員時,必須顯式調用該成員的預設建構函式,否則該成員將保持未賦值狀態且該結構不可用。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.