public struct MyStruct { public int T; }
定义一个泛型List来存放结构体,然后访问第一个元素去修改T,输出T:
List<MyStruct> arrLis =new List<MyStruct>(){new MyStruct()};
Console.WriteLine(arrLis[0].T);
很遗憾不是100,arrLis[0].T = 100;VS提示该语句有错误。Cannot modify the expression because it is not a variable.
再看下面的代码,我们修改一下,把泛型List改为Array数组。
MyStruct[] arrStr =new MyStruct[1]{new MyStruct()};
Console.WriteLine(arrStr[0].T);
ldelema:将位于指定数组索引的数组元素的地址作为 & 类型(托管指针)加载到计算堆栈的顶部。
到这里,Array跟List索引访问的区别出来了,Array是返回了对象的引用,而List返回的就是对象的值(值类型对象就是内部的值,引用类型对象是引用的地址)。
还没完,既然直接给赋值不行,那我用一个Set方法包装起来,去设置内部变量的值如何?
把List初始化语句也改一下,去掉一些语法糖,因为我们要查IL,语法糖会影响我们的判断。
List<MyStruct> arrLis = new List<MyStruct>();
var myStruct = new MyStruct();
Console.WriteLine(arrLis[0].T);
List<MyStruct> arrLis = new List<MyStruct>();
var myStruct = new MyStruct();
Console.WriteLine(arrLis[0].T);
这2段IL只有红线画出来的地方不一样,其实就是一个变量命名不一样而已。
why-can-struct-change-their-own-fields
what-is-the-difference-between-listt-and-array-indexers
Email:kklldog@gmail.com
作者:Agile.Zhou(kklldog)
出处:http://www.cnblogs.com/kklldog/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
联系客服