110,577
社区成员
发帖
与我相关
我的任务
分享
public struct AA
{
public int value;
public AA(int v)
{
value = v;
}
}
private static void TestChangeStructList()
{
//定义一个泛型List
List<AA> datas = new List<AA>();
//添加2个元素,value分别为1,2
datas.Add(new AA(1));
datas.Add(new AA(2));
//打印出当前元素
Console.WriteLine("原始List:");
datas.ForEach(o => Console.WriteLine(o.value.ToString()));
//使用List的索引器赋值
datas.ForEach(o => o.value++);
//打印出当前元素
Console.WriteLine("使用List的索引器赋值");
datas.ForEach(o => Console.WriteLine(o.value.ToString()));
//反射List内部的值类型数组赋值
AA[] items = (AA[])((FieldInfo)(datas.GetType().GetMember("_items", BindingFlags.NonPublic | BindingFlags.Instance)[0])).GetValue(datas);
items[0].value++;
items[1].value++;
//打印出当前元素
Console.WriteLine("反射List内部的值类型数组赋值");
datas.ForEach(o => Console.WriteLine(o.value.ToString()));
}
原始List:
1
2
使用List的索引器赋值
1
2
反射List内部的值类型数组赋值
2
3
[Quote=引用 26 楼 sp1234 的回复:]
在调用一个方法时,不论你写ref或者不写,传递的都是一个引用。而对struct,都是复制一个副本。
不过我倒是不关心struct,我倒是关心对象作为参数。“根据情况来按值或者引用传递”的误解就是对ref的误解。不论写不写它,对于对象做参数都是传递引用。或者你可以说,对象的引用被作为对象而传递了。
[/Quote]
非常贴切,但未必能理解。我举个例子描述一下sp1234大神的意思。
public class A
{
public int i = 0;
}
A obj = new A();
public void Foo(obj);
public void Foo(A a)
{
a.i = 5;//你可以修改a的i属性,因为a是传递的引用。但写不写ref可不同哦。
a = new A();//你可以给a重新赋值,但是a是传进来参数的副本,a的修改不过是形参,obj.i已然是5,不是0
}
A obj = new A();
public void Foo(ref obj);
public void Foo(ref A b)
{
b.i = 6;//b作为引用,修改i的值为6
b = new A();//你可以修改b的值,离开方法后,参数就变了,obj.i就是0了。
}
[TargetedPatchingOptOut("Performance critical to inline across NGen image boundaries")]
public T get_Item(int index)
{
if (index >= this._size)
{
ThrowHelper.ThrowArgumentOutOfRangeException();
}
return this._items[index];
}