黑马程序员_学习日记3_C#基础归纳总结之结构

---------------------- Windows Phone 7手机开发.Net培训、期待与您交流! ----------------------

结构:Struct

    说到结构 就不得不说到类。结构和类在使用方式上可以说的基本相同的。不同之处在于

结构是值类型,它存储在内存stack上,类是引用类型它是存储在内存堆上。

 

那么 我们在什么情况下去使用结构会比使用类效果要好点呢?

    类是存储在内存堆栈上的,通过这种方式,类在数据生存期上可以获得很大的灵活性。但会有一定的性能损失。因为托管堆的优化 这种损失会比较小。

但是,如果有时候 我们只需要一个小的数据结构。此时,就可以使用结构来代替类了。还有就是,类提供的功能要多于我们使用的功能的时候,最好是使用结构。

 

下面来定义一个结构:(看看它和类之间的区别)

struct MyStruct
{
    //结构可以象类一样有字段
    public double Length;
    public double Width;

//结构可以像类一样有构造函数
//int 是值类型数据
int i;
i=9;

public MyStruct(double length,double width){ Length = length; Width = width;}//结构可以像类一样有属性访问器public double Diagonal{ get { return Math.Sqrt(length*length+Width*width); }}}

从上面的例子中可以看出,结构的定义和类除了有一个class和struct的区别之外,其余的基本上是一模一样的。

但是结构是值类型,它是存储在内存栈上或者为内联(inline)(如果结构本身为堆中另一个对象的一部分)。它的申明周期和普通的值类型完全一样(和 int double一样。)

结构不支持继承,但所有的值类型数据 都有自己默认的集成链 : 值类型---------->System.ValueType--------->System.Object

其中 ValueType的作用是使当期集成它的类具有值类型特点。

 

结构虽然是值类型,但在语法上可以把结构就当做类来处理。

MyStruct Ms = new MyStruct();
Ms.Length=9;
Ms.Width =10;


因为结构是值类型,所以它的new和一般类类型的new的作用是不一样的。结构的new关键字并不会在堆中分配空间,而是调用结构的构造函数,根据传给它的参数,初始化字段。

所以下面这种写法也是合法的:

MyStuct Ms;
Ms.Length =9;
Ms.Width=10;


如果觉得这个不怎么好理解和记忆 请看下面这个例子

//int 是值类型数据
int i;
i=9;

 

前面讲过 可以通过ref 关键字将值类型数据强制转化为引用传递。这个关键字同样也可以运用于结构。

 

使用结构的时候,要注意,不能为结构定义 不带参数的构造函数。原因很坑爹,.NET运行库不能调用用户提供的不带参数的构造函数。睡觉

所以microsoft采取了就简单和最有效的方式,那就是不准用户你在结构中定义不带参数的构造函数。(个人认为,可能是结构和类的存储方式的不同而导致的这种情况。纯属猜测)

 

 

 

所以什么是结构呢?

结构就是 一小块数据集,它存储在内存栈上,它不支持继承(但有默认的继承链条 结构:System.VauleType:System.Object),不能在结构的内部定义不带参数的构造函数,在语法上可以把结构就当做类一样的来使用,

可以通过ref 关键字 来提高结构在作为方法参数时的程序运行效率。



---------------------- Windows Phone 7手机开发.Net培训、期待与您交流! ----------------------
详细请查看:http://net.itheima.com/


                
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值