struct和class的区别

本文解释了为什么不能从System.Guid继承NewGuid方法,并深入探讨了结构和类之间的关键区别,包括它们如何被使用、实例化以及在方法调用时的行为差异。

有人问“为什么不能继承System.Guid 中NewGuid方法呢”,答案是很简单的,因为System.Guid 是结构而不是类。

比如定义如下结构和类

 

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

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


 

这段代码将抛出编译错误内容为 "Class1: cannot inherit from sealed class MyType".

再如下面代码:

 

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

None.gif
None.gif
public   struct  Class1 : MyType
ExpandedBlockStart.gifContractedBlock.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.gifContractedBlock.gif
dot.gif {
InBlock.gif    
public int x;
ExpandedBlockEnd.gif}

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

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

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

InBlock.gif    
public static void Main()
ExpandedSubBlockStart.gifContractedSubBlock.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来实例化一个结构,那么所有的字段将仍然处于未分配状态,直到所有的字段被初始化.和类一样,结构可以执行接口.更重要的是,结构没有继承性,一个结构不能从别的类继承,也不能是别的类的基类.

博客园wljcan的文章
http://www.cnblogs.com/wljcan/archive/2004/04/19/6520.aspx

转载于:https://www.cnblogs.com/hbzxf/archive/2004/09/14/43142.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值