明辨值类型和引用类型的使用场合

1、值类型与引用类型的选择依赖于我们期望将来的客户程序如何使用我们的类型。值类型不支持多态,比较适合存储供应用程序操作的数据。应用类型支持多态,应该用于定义应用程序的行为。在设计类型时,我们应该考虑类型的责任,根据期望的责任,我们才能判断创建何种类型。简而言之,结构用于存储数据,类用于定义行为。

2、将类型设计为值类型还是引用类型是一个非常重要的决定。如果刚开始没有确定好,之后再将值类型改变为引用类型将带来很多层面的影响。考虑下面的类型:

public struct Employee
{
   private string _name;
   private int     _ID;
   private decimal _salary;

//省略了各个属性。

   public void Pay( BankAccount b )
   {
   b.Balance += _salary;
   }
}

上面的例子相当简单,只包含了一个方法用于向Employee支付薪水。系统刚开始运行的很好,但随着时间的进展,我们可能需要不同种类的Employee;销售人员可以获取代理佣金,经理则可以获取红利奖金。因此,我们需要将Employee更改为一个类。

这将会破坏许多目前正在使用原来Employee结构的代码。原来的“按值返回”将变为“按引用返回”。原来的“传值参数”将变为“传引用参数”。

.net文档推荐我们将类型的大小作为选择值类型还是引用类型的决定性因素。在现实中,一个更值得我们考虑的因素应该为类型的使用场合。如果具有比较简单的结构,或者是作为数据的载体,那就比较适合设计为值类型。值类型在内存管理方面也具有更好的效率:家少的堆内存碎片,较少的内存垃圾,以及较少的间接访问。更重要的是,值类型从方法或者属性中返回时使用的将是复制的方式——这避免了将内部结构的引用暴露给外界的危险。

3、综上所述,我们应该将用于底层数据存储的类型设计为值类型,将用于定义应用程序行为的类型设计为引用类型。这样一来,我们既获得了从类对象内复制数据的安全性,也获得了基于栈的和内联方式的存储模型所带来的内存优势,同时还能利用标准的面向对象技术来创建应用程序的逻辑。如果对类型将来的应用情况不确定,那就应该使用引用类型。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值