.NET 中類和結(jié)構(gòu)的區(qū)別

1. 值類型與引用類型

  • 結(jié)構(gòu)是值類型,值類型在堆棧上分配地址,所有的基類型都是結(jié)構(gòu)類型,例如int對應(yīng)System.int32結(jié)構(gòu)。
  • 類是引用類型,引用類型在堆上分配地址。
注解:
  • 對結(jié)構(gòu)變量所做的改變不會影響其的原值,而對于類,改變其變量的值會改變其原值。
  • 堆棧的執(zhí)行效率要比堆的執(zhí)行效率高,可是堆棧的資源有限,不適合處理大的邏輯復(fù)雜的對象。
  • 雖然結(jié)構(gòu)和類的類型不一樣,可是他們的基類型都是對象,C#中所有的類型的基類型都是object。

2. 繼承性

  • 結(jié)構(gòu)不能從另一個結(jié)構(gòu)或者類繼承,本身也不能被繼承,雖然結(jié)構(gòu)沒有明確的用sealed聲明,可是結(jié)構(gòu)是隱式的sealed。
  • 類完全可擴(kuò)展的,除非顯示的聲明sealed,否則類可以繼承其他類和接口,自身也能被繼承。
    注解:雖然結(jié)構(gòu)不能被繼承,可是結(jié)構(gòu)能夠繼承接口,方法和類繼承接口一樣。

3. 內(nèi)部結(jié)構(gòu)

  • 結(jié)構(gòu)沒有默認(rèn)的構(gòu)造函數(shù),但是可以添加構(gòu)造函數(shù),沒有析構(gòu)函數(shù),沒有abstract 和sealed(因?yàn)椴荒鼙焕^承),沒有protected修飾符,可以不適用new初始化。
  • 類有默認(rèn)的構(gòu)造函數(shù),有析構(gòu)函數(shù),可以使用abstract和sealed,有protected修飾符,必須使用new初始化。

4. 申明結(jié)構(gòu)用Struct關(guān)鍵字,申明類用class關(guān)鍵字。

code practice:

code
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace StructAndClass
{
    class Program
    {
        interface ITestInterface
        {
            void Paint();
        }

        // define a struct
        public struct TestStruct: ITestInterface
        {

            public string Name;
            public int height;
            public bool overWeight()
            {
                return true;
            }
            public void Paint() { }
        }

        // define a class
        public class TestClass: ITestInterface
        {
            public string Name = "Time";
            public void Paint() { }

            ~TestClass()
            {
                Console.WriteLine("Test class destructor.");
            }
        }

        public sealed class ClassExtend: TestClass
        {
            public ClassExtend()
            {
                Console.WriteLine("Test class is extended. However, this class can not be extended.");
            }
        }

        static void Main(string[] args)
        {
            //TestStruct structOne = new TestStruct();
            TestStruct structOne;
            structOne.Name = "Tim";
            structOne.height = 10;

            TestClass classOne = new TestClass();

            // error 
            //TestClass classOne;
            //classOne.Name = "Tim";

            Console.WriteLine("Struct's base class is object: " + ((structOne is object) ? "Yes" : "No"));
            Console.WriteLine("Class's base class is object: " + ((classOne is object) ? "Yes" : "No"));

            ClassExtend classExtend = new ClassExtend();

            structOne.Name = "Tim Changed";
            classOne.Name = "Tim Changed";
            Console.WriteLine("Test to change struct variable,name is changed: " + (structOne.Name == "Tim Changed" ? "Yes" : "No") + " Name: " + structOne.Name);
            Console.WriteLine("Test to change class variable, name is changed: " + (classOne.Name == "Tim Changed" ? "Yes" : "No") + " Name: " + classOne.Name);


            Console.ReadKey();
        }
    }
}

聯(lián)系方式

個人微信

公眾號_DotNet微說.jpg
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 夏天如期而至, 有風(fēng)也有藍(lán)天白云。 窗外不知從什么時(shí)候起蟬鳴不斷, 行走的路人匆匆而過, 天氣燥熱得讓人“悶悶不樂...
    笙和簫閱讀 701評論 6 15
  • 上閑魚賣東西,順便搜搜自己想要的。 發(fā)現(xiàn)現(xiàn)在造假真的是猖獗,一樣的包,比專柜要便宜九成。 從外觀上來說,并不能看出...
    星河2017閱讀 199評論 0 0

友情鏈接更多精彩內(nèi)容