c#基础系列之ref和out的深入理解

2020-01-05 09:20:48刘景俊

out修饰的函数变量在被调用方法中初始化之前是只写的(不能读取),而且函数执行完之前必须被初始化。以下方法编译是报错的,因为没有对out参数进行初始化


 static void Testref(out MyClass c1)
   {
    
   }

ref则是可写可读的。

c#,ref,out

性能

其实明白了ref和out的基本原理和作用之后,怎么用能提高性能其实已经很明了了。值类型参数如果比较大,业务又没有复制修改的需求,当然以引用方式会比较合理。至于引用类型无特殊需求场景我觉得没有必要添加ref或者out来画蛇添足。

其他

ref和out修饰引用类型参数

有的同学会问,引用类型参数本来不就是以引用方式传递的吗,在加ref或者out标记有什么意义吗? 的确,大多数情况下引用类型参数的传递没有必要添加ref或者out来修饰,但是如果方法体内我修改了指针的指向的内存地址,我们的方法调用者又需要这个新的内存地址呢? 例如:以下为一个连续读取N个文件的需求:


 static void Main(string[] args)
   {
    FileStream fs = new FileStream("新文件地址", FileMode.Open);
    //第一个文件的操作省略
    //接下来连续读取N个文件内容
    bool isHaveFile = true;
    for (; fs!=null; ReadFile(ref fs, isHaveFile))
    {
     fs.Read(.............);
     //添加判断是否还有文件可读
     // isHaveFile = false;
    }
    Console.Read();
   }
   static void ReadFile(ref FileStream fs,bool isHaveFile=true)
   {
    fs.Close();
    if (!isHaveFile) fs = null;
    else
    {
     fs = new FileStream("新文件地址", FileMode.Open);
    }
   }