VB.net 2010 视频教程 VB.net 2010 视频教程 python基础视频教程
SQL Server 2008 视频教程 c#入门经典教程 Visual Basic从门到精通视频教程
当前位置:
首页 > Python基础教程 >
  • C#教程之C# ref out 关键字

C# 的数据类型有两种:

一种是值类型(value type),一种是引用类型(reference type)。

值类型包括:结构体(数值类型,bool,用户自定义结构体)、枚举和可空类型。

引用类型包括:数组,用户定义的类、接口、委托,object,字符串。

值类型和引用类型的区别在于:函数参数传递的时候,值类型把自已的值复制一份传递给别的函数操作,也就是说无论函数的值怎么改变,其本身的值都不会受到影响。而引用类型则是把自己的地址传递给别的函数,操作的是他本身的值,所以当传递的值改变时,其本身的值也跟着改变。

       public static void ValueMethod(int i) { i++; }
        public static void RefMethod(ref int i) { i++; }
        public static int OutMethod(out int i) { i = 0;  i++; return i; }

        static void Main(string[] args)
        {
            int i = 0;
            ValueMethod(i);
            Console.WriteLine("i: "+i); //i: 0 

            int j = 0;
            RefMethod(ref j);
            Console.WriteLine("j: " + j); //j: 1

            int k = 0;
            Console.WriteLine("k: " + OutMethod(out k)); //k: 1
        }

如上例所示:

  • 在按值传递的情况下,i的值没有发生变化。
  • 在按引用传递的情况下,j的值递增,变成了计算之后的结果,同时需要在使用的时候显示写明ref关键字(不仅在方法定义时,在使用方法时也需要注明ref)
  • 使用out关键字,out后面的参数需要在方法内部赋值,不需要在使用方法的时候传值,只要标明关键字out即可。

字符串是一种特殊的引用类型变量:

        static void Main(string[] args)
        {
            StringBuilder sb = new StringBuilder("1");
            test(sb);
            Console.WriteLine(sb.ToString());
        }

        static void test(StringBuilder sb)
        {
            sb.Append("2");
        }

结果sb变成了12.

(上面例子如果我们在sb前面增加ref关键字,结果是一样的)

不过,如果我们只定义一个string a = "123",上面的方法是不能通过的,因为string是一种“不可变引用类型”。


相关教程