C# 函数只读参数
请问:C#中如何定义一个函数,另其参数在函数体内是只读的.void test(ClassA p),其中参数是一个类(引用类型)
谢谢!
------解决方案--------------------(1)你可以在方法体内再定义一个ClassA,复制过来。
(2)在方法体外,写一个断言,比较调用前后的GetHashCode()是否一致,如果不一致,说明被修改,果断中止程序丢出异常。
------解决方案--------------------那就告诉自己不要手欠去修改成员变量。。。
或者像caozhy说的,写个深拷贝的clone方法后再用。
------解决方案--------------------NianHui 真是屈死了。。。
------解决方案--------------------原谅我在10楼未经实验的回复。我把C++里的(const 参数)混入C#里了。
在C#里,除了int、byte、char、bool等基本类型是值传递外,数组、string和其他的对象都是引用传递。而C#又不象C++提供了对函数参数的const修饰,所以当我们向函数传递某个对象时,是通过引用传递进去的,在函数内部对参数的修改,将直接引起该引用指向的对象改变。
C#里提供了ref和out修饰符,主要用于将按值传递的基础类型变为按引用传递。ref和out都建立一份引用,区别只是ref的值要求初始化。
当然,对于本身已经是按引用传递的对象,我们也可以进行ref或者out的修饰,个人理解是为了语义上更简洁和明了。
即,没有用ref或者out修饰的对象,在函数体内养成习惯,不要去进行更改。
------解决方案--------------------
首先你要分清楚
按引用传递和
引用类型的参数的不同,这点在,.NET框架程序设计(修订版),第9章第5小节有详细的解释。
其次推荐你看篇博客
------解决方案--------------------internal void Test()
{
ClassA srcClass = new ClassA();
Console.WriteLine("Before function called : " + srcClass._strValue);
RefTest(srcClass);
Console.WriteLine("After function called: " + srcClass._strValue);
}
void RefTest(ClassA param)
{
ClassA copy_one = (ClassA)param.Clone();
copy_one._strValue = "Changed";
}
public class ClassA:ICloneable
{
public string _strValue = "defaultValue";
#region ICloneable 成员
public object Clone()
{
return this.MemberwiseClone();
}
#endregion
}