標籤: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建立結構對象時需要注意,在初始化所有欄位之前,欄位將保持未賦值狀態,同時對象不可用。也就是說,在結構對象包含的所有欄位(包含私人的、公有的、隱藏的(自動實作屬性在運行時產生的))初始化之前,該結構對象中的方法或者屬性都不可以調用。
③當結構包含參考型別作為成員時,必須顯式調用該成員的預設建構函式,否則該成員將保持未賦值狀態且該結構不可用。