日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > C# >内容正文

C#

c#中struct和class的区别

發布時間:2025/3/15 C# 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 c#中struct和class的区别 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

簡單來說,struct是值類型,創建一個struct類型的實例被分配在棧上。class是引用類型,創建一個class類型實例被分配在托管堆上。但struct和class的區別遠不止這么簡單。本篇主要包括:

?

■ 概括來講
■ 從賦值的角度體驗struct和class的不同
■ 從參數傳值角度體驗struct和class的不同
■ 從struct類型的struct類型屬性和struct引用類型屬性體驗struct和class的不同
■ 從構造函數體驗struct和class的不同
■ 從給類型成員賦初值體驗struct和class的不同
■ 何時使用struct,何時使用class?

?

? 概括來講

概括來講,struct和class的不同體現在:

?

● 類是引用類型,struct是值類型
● 在托管堆上創建類的實例,在棧上創建struct實例
● 類實例的賦值,賦的是引用地址,struct實例的賦值,賦的是值
● 類作為參數類型傳遞,傳遞的是引用地址,struct作為參數類型傳遞,傳遞的是值
● 類沒有默認無參構造函數,struct有默認無參構造函數
● 類支持繼承,struct不支持繼承
● 類偏向于"面向對象",用于復雜、大型數據,struct偏向于"簡單值",比如小于16字節,結構簡單
● 類的成員很容易賦初值,很難給struct類型成員賦初值
● 類的實例只能通過new SomeClass()來創建,struct類型的實例既可以通過new SomeStruct()來創建,也可以通過SomeStruct myStruct;來創建

?

? 從賦值的角度體驗struct和class的不同

? 引用類型賦值,是把地址賦值給了變量

class Program{static void Main(string[] args){SizeClass sizeClass = new SizeClass(){Width = 10, Length = 10};Console.WriteLine("賦值前:width={0},length={1}", sizeClass.Width, sizeClass.Length);var copyOfSizeClass = sizeClass;copyOfSizeClass.Length = 5;copyOfSizeClass.Width = 5;Console.WriteLine("賦值后:width={0},length={1}",sizeClass.Width, sizeClass.Length);Console.ReadKey();}}public class SizeClass{public int Width { get; set; }public int Length { get; set; }}public struct SizeStruct{public int Width { get; set; }public int Length { get; set; }}

以上,當把sizeClass賦值給copyOfSize變量的時候,是把sizeClass所指向的地址賦值給了copyOfSize變量,2個變量同時指向同一個地址。所以,當改變copyOfSizeClass變量的值,也相當于改變了sizeClass的值。

?

? struct類型賦值,是完全拷貝,在棧上多了一個完全一樣的變量

class Program{static void Main(string[] args){SizeStruct sizeStruct = new SizeStruct(){Length = 10, Width = 10};Console.WriteLine("賦值前:width={0},length={1}", sizeStruct.Width, sizeStruct.Length);var copyOfSizeStruct = sizeStruct;copyOfSizeStruct.Length = 5;copyOfSizeStruct.Width = 5;Console.WriteLine("賦值后:width={0},length={1}", sizeStruct.Width, sizeStruct.Length);Console.ReadKey();}}


以上,當把sizeStruct賦值給copyOfSizeStruct變量的時候,是完全拷貝,改變copyOfSizeStruct的值不會影響到sizeStruct。

?

? 從參數傳值角度體驗struct和class的不同

? 引用類型參數傳遞的是地址

class Program{static void Main(string[] args){List<string> temp = new List<string>(){"my","god"};temp.ForEach(t => Console.Write(t + " "));Console.ReadKey();}public static void ChangeReferenceType(List<string> list){list = new List<string>(){"hello", "world"};}}

結果顯示:my god


為什么不是hello world?
→棧上的temp指向托管堆上的一個集合實例
→當temp放到ChangeReferenceType(temp)方法中,本質是把temp指向的地址賦值給了變量list
→在ChangeReferenceType(List<string> list)方法內部,又把變量list的指向了另外一個集合實例地址
→但temp的指向地址一直沒有改變


我們再來改變ChangeReferenceType(List<string> list)內部實現方式,其它不變。

class Program{static void Main(string[] args){List<string> temp = new List<string>(){"my","god"}; ChangeReferenceType(temp);temp.ForEach(t => Console.Write(t + " "));Console.ReadKey();}public static void ChangeReferenceType(List<string> list){list.Clear();list.Add("hello");list.Add("world");}}

結果顯示:hello world


為什么不是my god??
→棧上的temp指向托管堆上的一個集合實例
→當temp放到ChangeReferenceType(temp)方法中,本質是把temp指向的地址賦值給了變量list
→在ChangeReferenceType(List<string> list)方法內部,把temp和list共同指向的實例清空,又添加"hello"和"world"2個元素
→由于list和temp指向的實例是一樣的,所以改變list指向的實例就等同于改變temp指向的實例

以上,很好地說明了:引用類型參數傳遞的是地址。

?

? 值類型struct參數傳遞的是值

class Program{static void Main(string[] args){Size s = new Size(){Length = 10, Width = 10};ChangeStructType(s);Console.Write("Length={0},Width={1}", s.Length,s.Width);Console.ReadKey();}public static void ChangeStructType(Size size){size.Length = 0;size.Width = 0;}}public struct Size{public int Length { get; set; }public int Width { get; set; }}

?

為什么Length和Width不是0呢?
→在棧上變量size
→當通過ChangeStructType(size),把s變量賦值給ChangeStructType(Size size)中的size變量,其本質是在棧上又創建了一個變量size,size的值和s是完全一樣的
→在ChangeStructType(Size size)內部改變size的值,與變量s毫無關系

?

? 從struct類型的struct類型屬性和struct引用類型屬性體驗struct和class的不同

? 假設有一個struct,它有struct類型的屬性

以下, struct類型Room有struct類型的屬性TableSize和TvSize,我們如何通過Room實例來修改其struct類型的屬性值呢?

class Program{static void Main(string[] args){Room r = new Room(){TableSize = new Size(){Length = 100, Width = 80},TvSize = new Size(){Length = 10, Width = 8}};r.TableSize.Length = 0;Console.WriteLine("table目前的尺寸是:length={0},width={1}", r.TableSize.Length, r.TableSize.Width);Console.ReadKey();}}public struct Size{public int Length { get; set; }public int Width { get; set; }}public struct Room{public Size TableSize { get; set; }public Size TvSize { get; set; }}

以上,r.TableSize.Length = 0;此處會報錯:不能修改r.TableSize的值,因為不是變量。的確,r.TableSize只是Size的一份拷貝,而且也沒有賦值給其它變量,所以r.TableSize是臨時的,會被自動回收,對其賦值也是沒有意義的。

?

如果要修改r.TableSize,只需把r.TableSize.Length = 0;改成如下:
r.TableSize = new Size(){Length = 0, Width = 0};

?

可見,改變struct類型的struct類型屬性的某個屬性是行不通的,因為像以上r.TableSize只是一份拷貝,是臨時的,會被自動回收的。要改變struct類型的struct類型屬性,就需要像上面一樣,給r.TableSize賦上一個完整的Size實例。

?

? 假設有一個struct,它有引用類型的屬性呢?

以下,struct類型的Room有引用類型屬性,TableSize和TvSize,如何通過Room實例來修改其引用類型的屬性值呢?并且,我們在類Size中定義了一個事件,當給Size的屬性賦值時就觸發事件,提示size類的屬性值發生了改變。

class Program{static void Main(string[] args){var oneSize = new Size() {Length = 10, Width = 10};var twoSize = oneSize;oneSize.Changed += (s, e) => Console.Write("Size發生了改變~~");oneSize.Length = 0;Console.ReadKey();}}public class Size{private int _length;private int _width;public event System.EventHandler Changed;public int Length{get { return _length; }set{_length = value;OnChanged();}}public int Width{get { return _width; }set { _width = value; OnChanged(); }}private void OnChanged(){if (Changed != null){Changed(this, new EventArgs());}}}public struct Room{public Size TableSize { get; set; }public Size TvSize { get; set; }}

運行,顯示:Size發生了改變~~

對oneSize.Length的修改,實際上修改的是oneSize.Length指向托管堆上的實例。

?

? 從構造函數體驗struct和class的不同

? struct類型包含隱式的默認無參構造函數

class Program{static void Main(string[] args){var size = new SizeStruct();Console.WriteLine("length={0},width={1}", size.Length, size.Width);Console.ReadKey();}}public struct SizeStruct{public int Length { get; set; }public int Width { get; set; }}

?

為什么我們沒有給SizeStruct定義無參構造函數,而沒有報錯?
--因為,struct類型有一個隱式的無參構造函數,并且給所有的成員賦上默認值,int類型屬性成員的默認值是0。

?

? 類不包含隱式無參構造函數

class Program{static void Main(string[] args){var size = new SizeClass();Console.WriteLine("length={0},width={1}", size.Length, size.Width);Console.ReadKey();}}public class SizeClass{public int Length { get; set; }public int Width { get; set; }public SizeClass(int length, int width){Length = length;Width = Width;}}

運行,報錯:SizeClass不包含0個參數的構造函數

?

? 從給類型成員賦初值體驗struct和class的不同

如果直接給字段賦初值。

public struct SizeStruct{public int _length = 10;}

運行,報錯:結構中不能有實例字段初始值設定項

?

如果通過構造函數給字段賦初值。

public struct SizeStruct{public int _length;public SizeStruct(){_length = 10;}}

運行,報錯:結構中不能包含顯式無參數構造函數

?

可見,給struct類型成員賦初值是不太容易的,而給class成員賦初值,no problem。

?

? 何時使用struct,何時使用class?

在多數情況下,推薦使用class類,因為無論是類的賦值、作為參數類型傳遞,還是返回類的實例,實際拷貝的是托管堆上引用地址,也就大概4個字節,這非常有助于性能的提升。

?

而作為struct類型,無論是賦值,作為參數類型傳遞,還是返回struct類型實例,是完全拷貝,會占用棧上的空間。根據Microsoft's Value Type Recommendations,在如下情況下,推薦使用struct:

● 小于16個字節
● 偏向于值,是簡單數據,而不是偏向于"面向對象"
● 希望值不可變


?

參考資料:
C# Fundamentals: The Differences Between Struct and Class
Difference between class and struct in C# .Net
Difference Between Class and Structure

轉載于:https://www.cnblogs.com/darrenji/p/3866784.html

總結

以上是生活随笔為你收集整理的c#中struct和class的区别的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 欧美经典一区 | 国产亚洲精品熟女国产成人 | 先锋资源中文字幕 | 午夜做爰xxxⅹ性高湖视频美国 | 中文字幕在线一区 | 我们的2018中文免费看 | 亚洲欧洲色图 | 在线免费看黄网站 | 久久精品国产亚洲a | 国产在视频线精品视频 | 岛国av不卡 | 男插女视频免费 | 免费看污黄网站在线观看 | 久久精品aⅴ无码中文字字幕重口 | 久久久久久网 | 91av在线免费 | av 日韩 人妻 黑人 综合 无码 | 美日韩精品视频 | 人妻丝袜一区 | 波多野结衣乳巨码无在线 | 美女羞羞动态图 | 日韩欧美麻豆 | 特级西西人体4444xxxx | 国产伦精品一区二区三区 | 成人a在线观看 | 污视频软件在线观看 | 国产一级免费观看 | 伊人热久久| 可以看的毛片 | 福利视频黄色 | 丝袜 中出 制服 人妻 美腿 | 成人高清 | 日韩毛片在线 | 人妖和人妖互交性xxxx视频 | 久久久久久久久久久久久女国产乱 | 国产福利小视频在线 | av加勒比在线 | 国产高清无遮挡 | 久久福利视频网 | 精品国产乱码久久久久久郑州公司 | 欧美性爱视频久久 | 精品人妻一区二区三区香蕉 | 欧美一区亚洲一区 | 99中文字幕 | 免费成人黄| 可以免费观看的av网站 | 水果视频污 | 久久99精品国产.久久久久 | 国内毛片视频 | 国产日韩欧美久久 | 亚洲色图影院 | 欧美精品亚洲精品日韩精品 | 久久国产一区二区 | 黄在线免费看 | 中文字字幕在线 | 真人bbbbbbbbb毛片 | 亚洲情se| 国产盗摄一区二区 | 青青在线免费观看 | 久久综合伊人77777麻豆最新章节 | 岛国精品资源网站 | 久久精品国产一区二区电影 | 性欧美极品另类 | 国产一级二级毛片 | 操伊人| 国产精品国产精品国产 | 久久人人爽爽 | 六月丁香婷婷网 | 国产日韩精品suv | 亚洲AV无码一区二区三区蜜桃 | 国产三区av | 电家庭影院午夜 | 国产激情一区二区三区视频免樱桃 | 内射干少妇亚洲69xxx | 国产一区二区三区免费视频 | 久草久草 | 久久久精品在线观看 | 免费毛片视频 | 久久久精品小视频 | 精品无码在线视频 | av免费观看网址 | 91免费视频国产 | 制服 丝袜 综合 日韩 欧美 | 99热香蕉| 水蜜桃色314在线观看 | av久久久 | 午夜精品久久久久久久无码 | 欧洲黄色片 | 久草视频国产 | 日本精品久久久久久 | 极品白嫩少妇无套内谢 | 美女诱惑一区 | 肉视频在线观看 | 在线国产一区 | 亚洲色偷偷综合亚洲av伊人 | 特黄老太婆aa毛毛片 | 韩日精品在线观看 | 在线视频二区 | 男女搞网站 |