c#中struct和class的區別

 轉自:http://hi.baidu.com/heiru/blog/item/3f20d243e6c9601372f05d5c.html

 

有這麼幾點不同:

1.struct 是值類型,class是對象類型

2.struct 不能被繼承,class可以被繼承

3.struct 默認的訪問權限是public,而class默認的訪問權限是private.

4.struct不能由程序員申明構造函數,即使是默認(不帶參數)的構造函數,同樣也不能有析構的處理部分。這是因爲Struct的構造函數是由編譯器自動生成的。並且Struct的用途是那些描述輕量級的對象,例如Line,Point等,並且效率比較高。

5.struct的new和class的new是不同的。struct的new就是執行一下構造函數創建一個新實例再對所有的字段進行Copy。而class則是在堆上分配一塊內存然後再執行構造函數,struct的內存並不是在new的時候分配的,而是在定義的時候分配

 

有人問“爲什麼不能繼承System.Guid 中NewGuid方法呢”,答案是很簡單的,因爲System.Guid 是結構而不是類。

比如定義如下結構和類

 

None.gifpublic struct MyType
ExpandedBlockStart.gif
dot.gif{
InBlock.gif    
public int MyInteger;
ExpandedBlockEnd.gif}

None.gif
None.gif
public class Class1 : MyType
ExpandedBlockStart.gif
dot.gif{
ExpandedBlockEnd.gif}


 

這段代碼將拋出編譯錯誤內容爲 "Class1: cannot inherit from sealed class MyType". 

再如下面代碼:

 

None.gifpublic struct MyType
ExpandedBlockStart.gif
dot.gif{
InBlock.gif    
public int MyInteger;
ExpandedBlockEnd.gif}

None.gif
None.gif
public struct Class1 : MyType
ExpandedBlockStart.gif
dot.gif{
ExpandedBlockEnd.gif}


 

編譯錯誤如下: "Class1: type in interface list is not an interface". 


下面列舉出微軟提供的例子供大家學習

None.gif//Copyright (C) 2000 Microsoft Corporation.  All rights reserved.
None.gif
None.gif
// struct2.cs
None.gif
using System;
None.gif
None.gif
class TheClass
ExpandedBlockStart.gif
dot.gif{
InBlock.gif    
public int x;
ExpandedBlockEnd.gif}

None.gif
None.gif
struct TheStruct
ExpandedBlockStart.gif
dot.gif{
InBlock.gif    
public int x;
ExpandedBlockEnd.gif}

None.gif
None.gif
class TestClass
ExpandedBlockStart.gif
dot.gif{
InBlock.gif    
public static void structtaker(TheStruct s)
ExpandedSubBlockStart.gif    
dot.gif{
InBlock.gif        s.x 
= 5;
ExpandedSubBlockEnd.gif    }

InBlock.gif    
public static void classtaker(TheClass c)
ExpandedSubBlockStart.gif    
dot.gif{
InBlock.gif        c.x 
= 5;
ExpandedSubBlockEnd.gif    }

InBlock.gif    
public static void Main()
ExpandedSubBlockStart.gif    
dot.gif{
InBlock.gif        TheStruct a 
= new TheStruct();
InBlock.gif        TheClass b 
= new TheClass();
InBlock.gif        a.x 
= 1;
InBlock.gif        b.x 
= 1;
InBlock.gif        structtaker(a);
InBlock.gif        classtaker(b);
InBlock.gif        Console.WriteLine(
"a.x = {0}", a.x);
InBlock.gif        Console.WriteLine(
"b.x = {0}", b.x);
ExpandedSubBlockEnd.gif    }

ExpandedBlockEnd.gif}

None.gif
None.gif


這個例子的輸出是:

a.x = 1b.x = 5

從這個例子例子可以看出,當一個結構被傳遞到一個方法時,被傳遞的只不過是一個副本,而一個類被傳遞時,被傳遞的是一個參考.所以a.x=輸出的是1,不變,而b.x卻變了.

還有的區別就是結構可以不用new來實例化,而類卻要.如果你不用new來實例化一個結構,那麼所有的字段將仍然處於未分配狀態,直到所有的字段被初始化.和類一樣,結構可以執行接口.更重要的是,結構沒有繼承性,一個結構不能從別的類繼承,也不能是別的類的基類.

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章