C#中类与结构体的区别
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)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C#中创建文件并追加内容和换行
- 下一篇: c# 通过鼠标点击绘制多边形