c#中結構體和類的比較
區別:
結構是一種用關鍵字struct宣告的自定義資料型別。與類相似,也可以包含建構函式,常數,欄位,方法,屬性,索引器,運算子和巢狀型別等,不過,結構是值型別。
1.結構的建構函式和類的建構函式不同。
a.結構不能包含顯式的無引數建構函式。結構成員講自動初始化為它們的預設值。
b.結構不能包含以下形式的初始值設定類:base(argument-list);
2.對於結構中的例項欄位成員,不能在宣告時賦值初始化。
3.宣告瞭結構型別後,可以使用new運算子建立構造物件,也可以不使用new關鍵字。如果不使用new,那麼在初始化所有欄位之前,欄位將保持未賦值狀態且物件不可用。
4.結構不支援繼承,即一個結構不能從另一個結構或類繼承,而且不能作為一個類的基類。但是,結構從基類OBJECT繼承。結構也可以實現介面。
5.什麼時候用結構呢?結構使用簡單,並且很有用,但是要牢記:結構在堆疊中建立,是值型別,而類是引用型別。每當需要一種經常使用的型別,而且大多數情況下該型別只是一些資料時,使用結構能比使用類獲得更佳效能。
最後引用部落格園的“越過林子”的話:
結構是值型別,所以會影響效能,但根據使用結構的方式,這種影響可能是正面的,也可能是負面的。正面的影響是為結構分配記憶體時,速度非常快,因為它們將內聯或者儲存在堆疊中。在結構超出了作用域被刪除時,速度也很快。另一方面,只要把結構作為引數來傳遞或者把一個結構賦給另一個結構(例如A=B,其中A和B是結構),結構的所有內容就被複制,而對於類,則只複製引用。這樣,就會有效能損失,根據結構的大小,效能損失也不同。注意,結構主要用於小的資料結構。但當把結構作為引數傳遞給方法時,就應把它作為ref引數傳遞,以避免效能損失——此時只傳遞了結構在記憶體中的地址,這樣傳遞速度就與在類中的傳遞速度一樣快了。另一方面,如果這樣做,就必須注意被呼叫的方法可以改變結構的值。
C#中結構與類的區別
作者:未知 時間:2004-10-20 12:12 出處:網際網路 責編:jizhuwo
摘要:暫無
本文目錄
類與結構的例項比較
類與結構的差別
如何選擇結構還是類
一.類與結構的示例比較:
結構示例:
public struct Person
{
string Name;
int height;
int weight
public bool overWeight()
{
//implement something
}
}
類示例:
public class TestTime
{
int hours;
int minutes;
int seconds;
public void passtime()
{
//implementation of behavior.
}
}
呼叫過程:
public class Test
{
public static ovid Main
{
Person Myperson=new Person //宣告結構
TestTime Mytime=New TestTime //宣告類
}
}
〈由廈嫻睦?又形頤強梢鑰吹劍?嗟納?骱徒峁溝納?鞣淺@嗨疲?皇竅薅ǚ?竺媸?struct 還是 class 的區別,而且使用時,定義新的結構和定義新的類的方法也非常類似。那麼類和結構的具體區別是什麼呢?
二 .類與結構的差別
1.值型別與引用型別
結構是值型別:值型別在堆疊上分配地址,所有的基型別都是結構型別,例如:int 對應System.int32 結構,string 對應 system.string 結構 ,通過使用結構可以建立更多的值型別
類是引用型別:引用型別在堆上分配地址
堆疊的執行效率要比堆的執行效率高,可是堆疊的資源有限,不適合處理大的邏輯複雜的物件。所以結構處理作為基型別對待的小物件,而類處理某個商業邏輯
因為結構是值型別所以結構之間的賦值可以建立新的結構,而類是引用型別,類之間的賦值只是複製引用
注:
1.雖然結構與類的型別不一樣,可是他們的基型別都是物件(object),c#中所有型別的基型別都是object
2.雖然結構的初始化也使用了New 操作符可是結構物件依然分配在堆疊上而不是堆上,如果不使用“新建”(new),那麼在初始化所有欄位之前,欄位將保持未賦值狀態,且物件不可用
2.繼承性
結構:不能從另外一個結構或者類繼承,本身也不能被繼承,雖然結構沒有明確的用sealed宣告,可是結構是隱式的sealed .
類:完全可擴充套件的,除非顯示的宣告sealed 否則類可以繼承其他類和介面,自身也能被繼承
注:雖然結構不能被繼承 可是結構能夠繼承介面,方法和類繼承介面一樣
例如:結構實現介面
interface IImage
{
void Paint();
}
struct Picture : IImage
{
public void Paint()
{
// painting code goes here
}
private int x, y, z; // other struct members
}
3.內部結構:
結構:
沒有預設的建構函式,但是可以新增建構函式
沒有解構函式
沒有 abstract 和 sealed(因為不能繼承)
不能有protected 修飾符
可以不使用new 初始化
在結構中初始化例項欄位是錯誤的
類:
有預設的建構函式
有解構函式
可以使用 abstract 和 sealed
有protected 修飾符
必須使用new 初始化
三.如何選擇結構還是類
討論了結構與類的相同之處和差別之後,下面討論如何選擇使用結構還是類:
1.堆疊的空間有限,對於大量的邏輯的物件,建立類要比建立結構好一些
2.結構表示如點、矩形和顏色這樣的輕量物件,例如,如果宣告一個含有 1000 個點物件的陣列,則將為引用每個物件分配附加的記憶體。在此情況下,結構的成本較低。
3.在表現抽象和多級別的物件層次時,類是最好的選擇
4.大多數情況下該型別只是一些資料時,結構時最佳的選擇
總結:
區別有三:
1: 類可以繼承,結構不可以.
2: 類是引用型別,結構是值型別
3: 類在堆中,結構在棧分配記憶體
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/12639172/viewspace-564912/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 儲存結構的種類與比較
- C#中類和結構的一個區別...C#
- C# 結構體與類的區別C#結構體
- 資料結構比較資料結構
- C#中結構體的應用C#結構體
- Java和.Net在做BS結構專案的比較Java
- golang類和結構體Golang結構體
- C#中各種Lock的速度比較C#
- C#比較dynamic和Dictionary效能C#
- C#中誰最快:結構還是類?
- Java不同資料結構記憶體消耗比較Java資料結構記憶體
- Swift-類和結構體Swift結構體
- C# 中 System.Range 結構體C#結構體
- [C#] string 和 StringBuilder 的比較C#UI
- C# DataRow 比較C#
- ORACLE 中IN和EXISTS比較Oracle
- 比較兩個的表結構差異
- MySQL中的NULL和空串比較MySqlNull
- 如何定義一個自帶資料區的結構體:三種資料結構體的比較結構體資料結構
- C#結構體C#結構體
- 結構體和類中屬性定義需要static地方結構體
- C# 中的只讀結構體(readonly struct)C#結構體Struct
- 小心C#中的只讀結構體成員C#結構體
- Python中實現結構體類Python結構體
- Transformer和MoE架構比較ORM架構
- C++中結構體與類的區別C++結構體
- B/S和C/S架構的比較架構
- (轉)ORACLE 中IN和EXISTS比較Oracle
- 堆和棧在程式中的比較
- powershell中的where和foreach比較
- OC中類的結構
- Go與C#的比較 - RedditGoC#
- C# 中 System.Index 結構體和 Hat 運算子(^)的全新用法C#Index結構體
- 【Java】比較業務實體資訊變化的工具類Java
- 類和結構
- MySQL 中的 distinct 和 group by 的效能比較MySql
- 抽象類 & 介面比較抽象
- C#基礎知識系列三(類和結構體、String和StringBuilder、equals和==)C#結構體UI