假如参数在运用过程当中被不测修正,将会带来不可预知的效果,而且这类毛病很难被检查到,所以我们在设想要领参数的时刻,要充分考虑通报援用范例参数或许援用体式格局通报援用范例参数能够带来的效果。
假如一个数据在通报过程当中不能被转变,就要在构建这个对象的时刻就使其值(字段或属性)不被转变。
一、关于简朴的参数的掌握
1、值范例参数通报
这类状况由于通报的是参数的副本,不影响原始值,不须要掌握。
2、援用范例参数通报
a、由值范例构成的数据结构
须要将字段设置为只读,属性只要get。赋值只能经由过程组织要领举行。
b、包括援用范例字段的数据结构
这类状况是递归的,须要保证字段为readonly,属性为get的同时,援用范例字段所运用范例也满足该请求。
public class SuperClass { private readonly int _no; private readonly SubClass _tag; public int NO { get{ return _no;} } public SubClass Tag { get{ retirn _tag;} } public SuperClass(int no,SubClass tag) { _no=no; _tag=tag; } } public class SubClass { private readonly int _field; public int Field { get{ return _field;} } public SubClass(int field) { _field=field; } }
二、关于庞杂援用范例参数通报的掌握
所谓庞杂,是参数是数组或鸠合范例,或许参数包括这些范例数据,这类状况下上面的要领不能保证参数数据不被修正,由于纵然对象为只读的,然则对象中的数组或鸠合字段(属性)照样能够修正的。
1、鸠合参数(包括鸠合字段的援用参数也一样)
.net 4.5之前版本能够运用不包括修正鸠合元素要领的接口来替代细致鸠合范例。比方运用IEnumerable<T>接口替代List<T>。4.5版本能够直接运用IReadOnlyCollection接口或完成该接口的鸠合范例。
2、数组参数
没有好的方法庇护数组范例参数不被修正,所以只管防止运用数组范例作为要领参数,除非用到可选参数时刻。
三、明白上面的东西须要辨别清晰一下观点的区分
1、值范例和援用范例的区分
2、值通报和援用通报(ref和out)的区分
3、通报援用范例参数和援用通报(ref和out)援用范例参数的区分 [这一点最轻易殽杂]
区分在于运用该参数过程当中为该援用新建了对象的状况下,前者不影响原始值,后者影响原始值,示例:
void FunA(MyClass a) { a=new MyClass("A"); } void FunB(ref MyClass a) { a=new MyClass("B"); } void Test() { MyClass a=new MyClass("A"); FunA(a); Print(a); //a照样原始的对象 TEST FunB(ref a); Print(a); //a变成新对象 B}
记着一条准绳:
值范例通报的是值的副本,援用范例通报的是对象援用,所以值参数的修正不影响原始值,援用范例的修正影响原始值;值通报的参数构建不影响原始值,援用通报(ref和out)影响原始值。
以上就是C# 数组作为参数通报涌现的问题解决的细致内容,更多请关注ki4网别的相干文章!