C# 中使用 List<struct T> 时的问题

  C# 2.0 中加入了泛型,只是与 C++ 的泛型相差极多,只具有最简单的泛化
而以,像 STL 重头戏的 traits 是无法使用的了(不过 sf.net 上有一个 CSTL
(C# STL)的项目,初具形状)。
 
  .NET 2.0 加入了一系列的泛型容器,如 List<T>,Dictionary<Key,
Value> 等。这些容器对于引用(Object 及子类)类型和原生数据类型(如 int,
double 等)支持得很好,然而对 struct 类型的元素的支持却有问题。这里所说
的问题是指,List<T> 并不能对等的代替 T[]。struct 类型的问题在于,你不能
直接修改 List<struct T> 中元素的成员。
 
  产生问题的原因在于,C# 只有针对“对象”的引用,而没有 C++ 那样针对
值类型的引用。struct T 是值类型,所以你在索引 List<struct T> 元素的时候,
返回的只是元素的一个值拷贝。自然,你对这个拷贝的成员的修改不会影响到真
实的元素。幸运的是,C# 编译器禁止这种操作。代码如下:
 
struct T
{
  public int a;
}
 
List<T> list;
list.Add(new T());
 
list[0].a = 100;   // 编译错误!!
 
// 实际你要这样做:
T t = list[0];
t.a = 100;
list[0] = t;
 
  在上面的代码里,我的解决办法是复制到一个临时变量,修改值,然后回写。
 
  为什么不能修改真实的元素,考虑如下代码:
 
public T this[int index]
{
  get
  {
    T t = list[index];
    return t;            // 返回的是拷贝,不是吗?
  }

 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值