C#中结构与类的区别

Posted on 2006-10-31 10:02  唐鈺小寶  阅读(185)  评论(0)    收藏  举报

目录

   类与结构的实例比较

   类与结构的差别

   如何选择结构还是类

 

一.类与结构的示例比较:

结构示例:

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  大多数情况下该类型只是一些数据时,结构时最佳的选

 

 

C# 及其特性

 

1.C#是一种从C++Java继承而来的,简单的,现代的,面向对象的语言.
2.
它的目标是综合Visual Basic高产和C++底层高效的特性.
3.
它是Microsoft Visual Studio7.0 的一部分.
4.Visual studio
支持Vb,VC++,C++,Vbscript,Jscript.所有这些语言提供对Microsft .NET平台的访问.
5..NET
包括一个Common Execution引擎和一个丰富的类库.
6.Microsofts JVM eqiv
就是Common language(通用语言)运行库(CLR).
7.CLR
支持不止一种语言,诸如 C#,VB.NET,Jscript,ASP.NET,C++.
8.
源代码--->中间语言代码(IL)--->(JIT 编译器)机器码.
9.
类和数据类型对所有.NET语言是通用的.
10.
我们能够用C#开发控制台应用程序,Windows应用程序,Web应用程序.
11.
C#中微软处理了C++问题,比如内存管理,指针等.
12.
它支持垃圾回收(无用内存回收),内存自动管理和其他许多特性.


C#
的主要特点

A.简单
1.C#
中指针已经消失.
2.
不安全的操作,比方说直接内存操作不被允许了.
3.C#
"::""->"操作符是没用的.
4.
因为它是基于.NET平台的,它继承了自动内存管理和垃圾回收的特点.
5.
原始数据类型可变的数据范围象Integer,Floats.
6.
整形数值01不再作为布尔值出现.C#中的布尔值是纯粹的truefalse值而且没有更多的"="操作符和"=="操作符错误."=="被用于进行比较操作而"="被用做赋值操作.

B.现代
1.C#
建立在当前的潮流上,对于创建相互兼容的,可伸缩的,健壮的应用程序来说是非常强大和简单的.
2.C#
拥有内建的支持来将任何组件转换成一个web service,运行在任何平台上的任何应用程序都可以通过互联网来使用这个服务.

C.面向对象的
1.C#
支持数据封装,继承,多态和对象界面(java中的interface关键字).
2.(int,float,double)
java中都不是对象,但是C#引入和结构体(structs)来使原始数据类型变成对象int i=1;String a=i Tostring();//转换(或者)Boxing

D.类型安全
1.
C#中我们不能进行不安全的类型转换象将double转换成boolean.
2.
值类型(常量类型)被初始化为零值而引用类型(对象和类被编译器自动初始化为零值.
3.
数组类型下标从零开始而且进行越界检查.
4.
类型溢出将被检查.

E.相互兼容性
1.C#
提供对COM和基于windows的应用程序的原始的支持.
2.
允许对原始指针的有限制的使用.
3.
用户不再需要显式的实现unkown和其它COM界面,这些功能已经内建.
4.C#
允许用户将指针作为不安全的代码段来操作老的代码.
5.VB.NET
和其它中间代码语言中的组件可以在C#中直接使用.

F.可伸缩性和可升级性
1..NET
引入了零部件的概念,它们通过其"手册"具有自描述的功能.手册确立了零部件的身份,版本,语言和数字签名等.零部件不需要在任何地方注册.
2.
要扩展我们的程序,我们只需要删除老的文件并用新的文件来升级它们.不需要注册动态链接库.
3.
升级软件组件的过程只是一个错误探测的任务.对代码的修改能够影响现存的程序,C#在语言中支持版本修改.对界面和方法重载的支持使得复杂的程序框架能随着时间发展和进化.

结论
C#
是一种现代的,类型安全的,面向对象的编程语言,它使得程序员能够快速而容易的为微软.NET平台开发解决方案.