C# 中類和結構的區別


類:
類是引用類型在堆上分配,類的實例進行賦值只是復制了引用,都指向同一段實際對象分配的內存
類有構造和析構函數
類可以繼承和被繼承
結構:
結構是值類型在棧上分配(雖然棧的訪問速度比較堆要快,但棧的資源有限放),結構的賦值將分配產生一個新的對象。
結構沒有構造函數,但可以添加。結構沒有析構函數
結構不可以繼承自另一個結構或被繼承,但和類一樣可以繼承自接口

結構體和類同樣能夠定義字段,方法和構造函數,都能實例化對象,這樣看來結構體和類的功能好像是一樣的了,但是他們在數據的存儲上是不一樣的(以下摘錄):
C#結構體和類的區別問題:在C#編程語言中,類屬於引用類型的數據類型,結構體屬於值類型的數據類型,這兩種數據類型的本質區別主要是各自指向的內存位置不同。傳遞類的時候,主要表現為是否同時改變了源對象。
C#結構體和類的區別技術要點:
    ◆類在傳遞的時候,傳遞的內容是位於托管內存中的位置,結構體在傳遞的時候,傳遞的內容是位於程序堆棧區的內容。當類的傳遞對象修改時,將同時修改源對象,而結構體的傳遞對象修改時,不會對源對象產生影響。
    ◆在一個類中,可以定義默認的、不帶參數的構造函數,而在結構體中不能定義默認的、不帶參數的構造函數。兩者都可以定義帶有參數的構造函數,通過這些參數給各自的字段賦值或初始化

代碼運行如下:類中賦值以后,兩個對象中的值都發生變化,而結構體原來對象的值為發生變化

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

namespace ConsoleApplication1
{
    public enum Gender
    { 
        男,
        女
    }

    public struct sPerson 
    {
        public string name;
        public int age;
        public Gender sex;

        public void say() {
            Console.WriteLine("Hello , my name is {0} , i am {1} years old", this.name,this.age);
        }

        public sPerson(string name,int age,Gender sex) {
            this.name = name;
            this.age = age;
            this.sex = sex;
        }

        public sPerson() {
            this.name = "default";
            this.age = 0;
            this.sex = Gender.男;  
        }
    }

    public class Person
    {
        public string name;
        public int age;
        public Gender sex;

        public void say() {
            Console.WriteLine("Hello , my name is {0}, i am {1} years old", this.name,this.age);
        }

        public Person(string name,int age,Gender sex) {
            this.name = name;
            this.age = age;
            this.sex = sex;
        }

        public Person() {
            this.name = "default";
            this.age = 0;
            this.sex = Gender.男;
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            sPerson sp1 = new sPerson("jack", 25, Gender.男);
            sp1.say();
            sPerson sp2 = new sPerson();
            sp2.say();
            Person p1 = new Person();
            p1.say();
            Person p2 = new Person("mick", 30, Gender.男);
            p2.say();
            Console.ReadKey();
        }
    }
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM