在C#语言中,参数的传递有两种,一种是值传递,一种是引用传递。ref与out这两种方式都属于引用传递,只是他们的用法稍有不同。下面看几个例子 使用ref的例子 class test { static void gump(int i) { i=12; i += 1; } static void Main() { int i = 10; gump(i); Console.WriteLine(i); } } 输出结果为:10 再看 class test { static void gump(ref int i) { i=12; //这个可以不赋值,也不会报错 i += 1; } static void Main() { int i = 10; gump(ref i); Console.WriteLine(i); } } 输出结果:11 使用out的例子 class test { static void gump(out int i) { i=12; //必须对i初始化,否则会报错。 (这块就是ref和out的区别之一) i += 1; } static void Main() { int i = 10; gump(out i); Console.WriteLine(i); } } 当希望方法返回多个值时,声明 out 方法非常有用。使用 out 参数的方法仍然可以返回一个值。一个方法可以有一个以上的 out 参数。 下面来举例说明一下out 的用法 示例: class gump { public void math_routines(double x, out double half, out double squared, out double cubed) { half = x / 2; //必须初始化,否则会报错 squared = x * x; //必须初始化,否则会报错 cubed = x * x * x; //必须初始化,否则会报错 } } class TestApp { public static void Main() { gump g = new gump(); double x1 = 60; double half1 = 0; double squared1 = 0; double cubed1 = 0; Console.WriteLine("Before method->x1={0},half1={1},squared1={2},cubed1={3}", x1,half1 ,squared1,cubed1); g.math_routines(x1, out half1, out squared1, out cubed1); Console.WriteLine("After method->x1={0},half1={1},squared1={2},cubed1={3}", x1, half1, squared1, cubed1); } } ref用法示例: class gump { public double square(ref double x) { x *= x; //可以不初始化,不会报错 return x; } } class Program { static void Main(string[] args) { gump g = new gump(); double a = 3; double b = 5; Console.WriteLine("Before square->a={0},b={1}", a, b); a = g.square(ref a); Console.WriteLine("After square->a={0},b={1}", a, b); } } 从上面的例子可以看出: ref必须先初始化才能完成引用。out是内部为外部赋值,所以不需要初始化。 ref是内部对外部的值进行改变,而out则是内部为外部变量赋值。可以返回多个值。