当前位置:编程学习 > C#/ASP.NET >>

遍历修改结构成员

假设我有个结构
 Public Structure mystru
        Dim a As Single
        Dim b As Single
 End Structure
又声明一个数组 dim struarray(4) as mystru
然后我把一个数组 dim c(1) as single 分别赋值给strucarray(i).a struarray(i).b
我不想用以下方法
for i=0 to 4
getdata(c) '获取数组的值
strucarray(i).a=c(0)
strucarray(i).b=c(1)
next i

我想用反射
for i=0 to 4
Dim CurrentType As Type = config.GetType
dim j as integer
getdata(c) '获取数组的值
For Each GetfieldInfo As FieldInfo In CurrentType.GetFields()
    if j>=1 then exit for
    myFieldInfo.SetValue(strucarray(i), c(j))            
    j+=1       
Next
Next
代码能够正常执行,但为什么不不能改变strucarray的值呢?

--------------------编程问答-------------------- 红色的部分不匹配吧
For Each GetfieldInfo As FieldInfo In CurrentType.GetFields() 
    if j>=1 then exit for 
    myFieldInfo.SetValue(strucarray(i), c(j))            
    j+=1      
Next  --------------------编程问答-------------------- 不好意思写错了,都是myFieldInfo.我说代码可以执行,大家不要看语法.看方法是否可行 --------------------编程问答-------------------- config.GetType跟Public Structure mystru有什么关系? --------------------编程问答-------------------- 因为设置的是装箱后的对象,不是原来的对象

注意这一句:
myFieldInfo.SetValue(strucarray(i), c(j))
看一下strucarray的声明:dim struarray(4) as mystru 
那么strucarray(i)返回的是一个mystru(值类型)
FieldInfo.SetValue方法的签名是:SetValue(obj as object, value as object)
那么要正确地掉用这个方法,编译器就必须把strucarray(i)的返回值装箱
装箱后就得到了另一个对象(类型为mystru的boxing form)(暂时给它一个名字boxed)
因此,执行完SetValue后对象boxed的内容发生了改变,但是strucarray(i)的对象并不会被修改(因为根本就是2个不同的对象)
所以,运行的结果和楼主的期待并不一致

(后传:之后的某个时刻,gc开始回收资源,gc发现boxed对象不被任何线程或静态成员直接或间接的引用,就被断言为是垃圾,回收boxed所消耗的内存,之后,楼主代码所产生的副作用也被gc清除掉了。)
补充:.NET技术 ,  VB.NET
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,