首先:两者都是按地址传递的,使用后都将改变原来参数的数值。
其次:ref可以把参数的数值传递进函数,但是out是要把参数清空,就是说你无法把一个数值从out传递进去的,out进去后,参数的数值为空,所以在方法内必须初始化一次,这个就是两个的区别。
或者说就像有的网友说的,ref是有进有出,out是只出不进。

Ref的使用例子

  1. class Program
  2. {
  3. static void Main(string[] args)
  4. {
  5.      string tmp="传值之前"; //声明并初始化 这时如果输出tmp值为"传值之前"
  6.    User _user=new User();
  7. _user.Name(ref tmp);
  8. Console.WriteLine("{0}",tmp);
  9. Console.ReadKey(true);
  10. }
  11. }
  12. class User
  13. {
  14. public void Name(ref string tmps)
  15. {
  16. tmps="传值之后";
  17. }
  18. }
  19. 结果:传值之后

Out的使用例子

  1. class Program
  2. {
  3. static void Main(string[] args)
  4. {
  5. string tmp; //先声明,但不初始化
  6. User _user=new User();
  7. _user.Name(out tmp); //调用Name方法
  8. Console.WriteLine("{0}",tmp); //这时tmp的值为“在这里面赋值了”
  9. Console.ReadKey(true);
  10. }
  11. }
  12. class User
  13. {
  14. public void Name(out string tmps)
  15. {
  16. tmps="在这里面赋值了";
  17. }
  18. }
  19. 结果: 在这里面赋值了