在C#中如果你想经过某个函数之后,返回多个类型不相关的值。可能你需要用到ref或者out来进行实现。
1.ref定义
引用形参
用ref修饰符声明的形参是引用形参(referenceparameter),用于输入和输出参数的传递。为引用参数传递的实参必须是变量。引用形参并不创建新的存储位置,其存储位置就是方法调用中作为实参给出的那个变量所表示的存储位置。故当控制权传递回调用方法时,在方法中对参数的任何更改都将反映在该变量中。
当形参为引用形参时,则方法定义和调用方法都必须显式使用ref关键字。方法调用中的对应实参必须为与形参类型相同的变量,且变量在作为引用形参传递之前,必须先明确赋值。
2.out定义
输出形参
用out修饰符声明的形参是输出形参(outputparameter),用于输出参数的传递。与引用形参类似,输出形参并不创建新的存储位置,其存储位置就是方法调用中作为实参给出的那个变量所表示的存储位置。事实上,输出形参主要用于当控制权传递回调用方法时,把输出值传递给相应的变量(当希望方法返回多个值时)。
当形参为输出形参时,则方法定义和调用方法都必须显式使用out关键字。方法调用中的对应实参必须为与形参类型相同的变量,但变量在作为输出形参传递之前,不需要确赋值,但是在将变量作为输出形参传递的调用之后,必须明确赋值。
其实大致意思:
ref需要提前定义并赋值
out需要提前定义并不需要赋值,但必须在调用的函数中为其赋值
ref调用方法:
using System;namespace test01{class Program{static void RefTest(ref string s){s = \"ref\";}static void Main(string[] args){string s=\"1\";Program.RefTest(ref s);Console.WriteLine(s);Console.ReadKey();}}}
运行结果:
out使用方法:
using System;namespace test01{class Program{static void RefTest(out string s){s = \"out\";}static void Main(string[] args){/**string s=\"1\";注释的与下面的定义都可以*/string s;Program.RefTest(out s);Console.WriteLine(s);Console.ReadKey();}}}
运行结果: