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

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


 static void Main(string[] args)
   {
    MyClass c = new MyClass();
    //以下语句编译报错的
    Testref(out c);
    Console.Read();
   }  
   static void Testref(out object c1)
   {
    c1 = new object();
   }
   
   class MyClass
   {
    public int Id { get; set; }
   }

不同之处

编译之后的元数据有一个bit的差别,上边已经提及,此处不过多阐述。

对于方法的重载,c#编译器是不允许只有ref和out区别的重载方法。以下方法的重载形式是不允许的。


 void test(ref int) { }
 void test(out int) { }

ref和out对于c#编译器表达的意图是不一样的。ref告诉编译器调用函数之前必须初始化;out则反之,调用函数之前不必初始化。这其实也证实了“ref用于输入,out用于输出”的说法是有一点道理的,但是不是完全正确,难道我ref不能用于方法的输出吗?呵呵呵


 class Program
  {
   static void Main(string[] args)
   {
    int i = 10;
    Console.WriteLine(i);
    Test(ref i);
    Test(ref i);
    Console.WriteLine(i);
    Console.Read();
   }
   static void Test(ref int i)
   {
    i += 10;
   }
  }

运行结果:

    10
    30

所以我认为真正的用法是:

ref是有进有出,而out是只出不进。