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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > C# >内容正文

C#

C#中类与结构体的区别

發(fā)布時間:2023/12/18 C# 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C#中类与结构体的区别 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

1、在C#中結(jié)構(gòu)體類型定義時,成員是不能初始化的,這樣就導(dǎo)致了,定義結(jié)構(gòu)體變量時,變量的所有成員都要自己賦值初始化。但對于類,在定義類時,就可以初始化其中的成員變量,所以在定義對象時,對象本身就已經(jīng)有了初始值,你可以自己在重新給個別變量賦值。(注意在C 中,類的定義中是不能初始化的,初始化要放在構(gòu)造函數(shù)中)

2、結(jié)構(gòu)體變量 和類對象 進行值傳遞時,結(jié)構(gòu)體變量進行的就是值傳遞,而類對象進行的是引用傳遞,或者說傳遞的是指針,這樣在函數(shù)中改變參數(shù)值,結(jié)構(gòu)體對象的值是不變的,而類對象的值是變化了。

?

下邊是轉(zhuǎn)載的資料:

C#腳本中處理類與結(jié)構(gòu)體的區(qū)別:

結(jié)構(gòu)是一種用關(guān)鍵字struct聲明的自定義數(shù)據(jù)類型。與類相似,也可以包含構(gòu)造函數(shù),常數(shù),字段,方法,屬性,索引器,運算符和嵌套類型等,不過,結(jié)構(gòu)是值類型。

1.結(jié)構(gòu)的構(gòu)造函數(shù)和類的構(gòu)造函數(shù)不同。

a.結(jié)構(gòu)不能包含顯式的無參數(shù)構(gòu)造函數(shù)。結(jié)構(gòu)成員講自動初始化為它們的默認值。

b.結(jié)構(gòu)不能包含以下形式的初始值設(shè)定類:base(argument-list);

2.對于結(jié)構(gòu)中的實例字段成員,不能在聲明時賦值初始化。

3.聲明了結(jié)構(gòu)類型后,可以使用new運算符創(chuàng)建構(gòu)造對象,也可以不使用new關(guān)鍵字。如果不使用new,那么在初始化所有字段之前,字段將保持未賦值狀態(tài)且對象不可用。

4.結(jié)構(gòu)不支持繼承,即一個結(jié)構(gòu)不能從另一個結(jié)構(gòu)或類繼承,而且不能作為一個類的基類。但是,結(jié)構(gòu)從基類OBJECT繼承。結(jié)構(gòu)也可以實現(xiàn)接口。

5.什么時候用結(jié)構(gòu)呢?結(jié)構(gòu)使用簡單,并且很有用,但是要牢記:結(jié)構(gòu)在堆棧中創(chuàng)建,是值類型,而類是引用類型。每當(dāng)需要一種經(jīng)常使用的類型,而且大多數(shù)情況下該類型只是一些數(shù)據(jù)時,使用結(jié)構(gòu)能比使用類獲得更佳性能。

最后引用博客園的“越過林子”的話:

結(jié)構(gòu)是值類型,所以會影響性能,但根據(jù)使用結(jié)構(gòu)的方式,這種影響可能是正面的,也可能是負面的。正面的影響是為結(jié)構(gòu)分配內(nèi)存時,速度非常快,因為它們將內(nèi)聯(lián)或者保存在堆棧中。在結(jié)構(gòu)超出了作用域被刪除時,速度也很快。另一方面,只要把結(jié)構(gòu)作為參數(shù)來傳遞或者把一個結(jié)構(gòu)賦給另一個結(jié)構(gòu)(例如A=B,其中A和B是結(jié)構(gòu)),結(jié)構(gòu)的所有內(nèi)容就被復(fù)制,而對于類,則只復(fù)制引用。這樣,就會有性能損失,根據(jù)結(jié)構(gòu)的大小,性能損失也不同。注意,結(jié)構(gòu)主要用于小的數(shù)據(jù)結(jié)構(gòu)。但當(dāng)把結(jié)構(gòu)作為參數(shù)傳遞給方法時,就應(yīng)把它作為ref參數(shù)傳遞,以避免性能損失——此時只傳遞了結(jié)構(gòu)在內(nèi)存中的地址,這樣傳遞速度就與在類中的傳遞速度一樣快了。另一方面,如果這樣做,就必須注意被調(diào)用的方法可以改變結(jié)構(gòu)的值。

結(jié)構(gòu)體的定義:

結(jié)構(gòu)體也可以象類一樣可以單獨定義.
class?a{};
struct?a{};

結(jié)構(gòu)體也可以在名字前面加入控制訪問符.
public?struct?student{};
internal?struct?student{};

如果結(jié)構(gòu)體student沒有publice或者internal的聲明 類program就無法使用student結(jié)構(gòu)定義 obj對象
如果結(jié)構(gòu)體student的元素沒有public的聲明,對象obj就無法調(diào)用元素x
因為默認的結(jié)構(gòu)體名和元素名是*******類型
程序:
using?System;
public?struct?student
{
public?int?x;
};

class?program
{
public?static?void?Main()
{
student obj=new?student();
obj.x=100;
}

};
在結(jié)構(gòu)體中也可以定義靜態(tài)成員與類中一樣,使用時必須用類名,或結(jié)構(gòu)名來調(diào)用不屬于實例,聲明時直接定義.
程序:
using?System;
public?struct?student
{
public?static?int?a?=?10;
};
class?exe
{
public?static?void?Main()
{
Console.WriteLine( student.a?=?100);
}
};

using?System;
class?base
{
public?struct?student
{
public?static?int?a?=?10;
};
}
class?exe
{
public?static?void?Main()
{
Console.WriteLine(?base.student.a?=?100);
}
};
在結(jié)構(gòu)體中可以定義構(gòu)造函數(shù)以初始化成員,但不可以重寫默認無參構(gòu)造函數(shù)和默認無參析構(gòu)函數(shù)
程序:
public?struct?student
{
public?int?x;
public?int?y;
public?static?int?z;
public?student(int?a,int?b,int?c)
{
x=a;
y=b;
student.z=c;
}

};
在結(jié)構(gòu)體中可以定義成員函數(shù)。
程序:
public?struct?student
{
public?void?list()
{
Console.WriteLine("這是構(gòu)造的函數(shù)");
}

};
結(jié)構(gòu)體的對象使用new運算符創(chuàng)建(obj)也可以直接創(chuàng)建單個元素賦值(obj2)這是與類不同的因為類只能使用new創(chuàng)建對象
程序:
public?struct?student
{
public?int?x;
public?int?y;
public?static?int?z;
public?student(int?a,int?b,int?c)
{
x=a;
y=b;
student.z=c;
}

};
class?program
{
public?static?void?Main()
{
student obj=new?student(100,200,300);
student obj2;
obj2.x=100;
obj2.y=200;
student.z=300;
}
}

在使用類對象和函數(shù)使用時,使用的是引用傳遞,所以字段改變
在使用結(jié)構(gòu)對象和函數(shù)使用時,是用的是值傳遞,所以字段沒有改變

程序:
using?System;
class?class_wsy
{
public?int?x;
}
struct?struct_wsy
{
public?int?x;
}
class?program
{
public?static?void?class_t(class_wsy obj)
{
obj.x?=?90;
}
public?static?void?struct_t(struct_wsy obj)
{
obj.x?=?90;
}
public?static?void?Main()
{
class_wsy obj_1?=?new?class_wsy();
struct_wsy obj_2?=?new?struct_wsy();
obj_1.x?=?100;
obj_2.x?=?100;
class_t(obj_1);
struct_t(obj_2);
Console.WriteLine("class_wsy obj_1.x={0}",obj_1.x);
Console.WriteLine("struct_wsy obj_2.x={0}",obj_2.x);
Console.Read();
}
}
結(jié)果為:class_wsy obj_1.x=90
struct_wsy obj_2.x=100

----------------------------------------------------------------------------------------------------------------------------------------------

另:

正確

public?StructTest(int i)
{
Name = i;
}
public int Name;

StructTest stest;

stest.i=12;

錯誤

public?StructTest(int i)
{
Name = i;
}
public int Name{get;set;};

StructTest stest;

stest.i=12;

總結(jié)

以上是生活随笔為你收集整理的C#中类与结构体的区别的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。