日期:2014-05-17  浏览次数:21448 次

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
}