标题: 【原】 C#关键字 Ref 学习笔记
- temptation 2008-04-16 12:11 阅读:181
- 评论:2 查看评论 | 添加评论

早上 BoyLee 问我对 " Ref " 是否理解,很惭愧[图片],不知道这个关键字的用法,赶快学习了一下[图片]

[图片]using System;
[图片]using System.Collections.Generic;
[图片]using System.Text;
[图片]
[图片]namespace RefDemo
[图片][图片][图片]{
[图片]    class Program
[图片][图片]    [图片]{
[图片][图片]        /**//// <summary>
[图片]        /// 演示值类型的Ref用法
[图片]        /// </summary>
[图片]        /// <param name="i"></param>
[图片]        static void Method_1(ref int i)
[图片][图片]        [图片]{
[图片]            i = 7;
[图片]        }
[图片][图片]        /**//// <summary>
[图片]        /// 演示引用类型的Ref用法
[图片]        /// </summary>
[图片]        /// <param name="str"></param>
[图片]        static void Method_2(ref string str)
[图片][图片]        [图片]{
[图片]            str = "Bechham";
[图片]        }
[图片]
[图片]        static void Method_3(int i)
[图片][图片]        [图片]{
[图片]            i = 7;
[图片]        }
[图片]
[图片]        static void Method_4(string str)
[图片][图片]        [图片]{
[图片]            str = "Bechham";
[图片]        }
[图片]
[图片][图片]        /**//// <summary>
[图片]        /// 演示数组的Ref用法
[图片]        /// </summary>
[图片]        /// <param name="arr"></param>
[图片]        static void Method_5(int[] arr)
[图片][图片]        [图片]{
[图片]            for (int i = 0; i < arr.Length; i++)
[图片]                arr[i] = 0;
[图片]        }
[图片][图片]        /**//// <summary>
[图片]        /// 演示数组的Ref用法
[图片]        /// </summary>
[图片]        /// <param name="arr"></param>
[图片]        static void Method_6(string[] arr)
[图片][图片]        [图片]{
[图片]            for (int i = 0; i < arr.Length; i++)
[图片]                arr[i] = "Catherine";
[图片]        }
[图片]
[图片][图片]        /**//// <summary>
[图片]        /// 演示值类型的Out用法
[图片]        /// </summary>
[图片]        /// <param name="i"></param>
[图片]        static void Method_7(out int i)
[图片][图片]        [图片]{
[图片]            i = 7;
[图片]        }
[图片][图片]        /**//// <summary>
[图片]        /// 演示引用类型的Out用法
[图片]        /// </summary>
[图片]        /// <param name="str"></param>
[图片]        static void Method_8(out string str)
[图片][图片]        [图片]{
[图片]            str = "Bechham";
[图片]        }
[图片]
[图片]        static void Main(string[] args)
[图片][图片]        [图片]{
[图片]            int val_1 = 22;             // 使用Ref,需要初始化
[图片]            Method_1(ref val_1);
[图片]
[图片]            string str_2 = "Kaka";      // 使用Ref,需要初始化
[图片]            Method_2(ref str_2);
[图片]
[图片]            Console.WriteLine("Number:{0},Name:{1}", val_1, str_2);
[图片]
[图片]            Console.WriteLine("------------------------------");
[图片]
[图片]            int val_3 = 10;
[图片]            Method_3(val_3);            // 值改变
[图片]
[图片]            string str_4 = "Zidane";
[图片]            Method_4(str_4);            // 值改变
[图片]
[图片]            Console.WriteLine("Number:{0},Name:{1}", val_3, str_4);
[图片]
[图片]            Console.WriteLine("------------------------------");
[图片]
[图片][图片]            int[] arr_5 = [图片]{ 1, 2, 3, 4, 5};
[图片]
[图片]            for (int i = 0; i < arr_5.Length; i++)
[图片]                Console.WriteLine("Array(" + i + "):" + arr_5[i].ToString());
[图片]
[图片]            Method_5(arr_5);            // 这里没有使用REF 参数. 
[图片]
[图片]            for (int i = 0; i < arr_5.Length; i++)
[图片]                Console.WriteLine("Array(" + i + "):" + arr_5[i].ToString());
[图片]
[图片]            Console.WriteLine("------------------------------");
[图片]
[图片][图片]            string[] arr_6 = [图片]{ "ktgu", "lee", "lion"};
[图片]
[图片]            for (int i = 0; i < arr_6.Length; i++)
[图片]                Console.WriteLine("Array(" + i + "):" + arr_6[i].ToString());
[图片]
[图片]            Method_6(arr_6);            // 这里没有使用REF 参数. 
[图片]
[图片]            for (int i = 0; i < arr_6.Length; i++)
[图片]                Console.WriteLine("Array(" + i + "):" + arr_6[i].ToString());
[图片]
[图片]            Console.WriteLine("------------------------------");
[图片]
[图片]            int val_7;                  // 使用Out,不需要初始化
[图片]            Method_7(out val_7);
[图片]
[图片]            string str_8;               // 使用Out,不需要初始化
[图片]            Method_8(out str_8);
[图片]
[图片]            Console.WriteLine("Number:{0},Name:{1}", val_7, str_8);          
[图片]
[图片]            Console.ReadLine();
[图片]        }
[图片]    }
[图片]}

运行结果:
[图片]

Ref 在C#中被定义为方法参数。MSDN中对其描述如下:
ref 关键字使参数按引用传递。其效果是,当控制权传递回调用方法时,在方法中对参数的任何更改都将反映在该变量中。
若要使用 ref 参数,则方法定义和调用方法都必须显式使用 ref 关键字。

Out 是另一个C#中的方法参数。MSDN中对其描述如下:
out 关键字会导致参数通过引用来传递。
这与 ref 关键字类似,不同之处在于 ref 要求变量必须在传递之前进行初始化。
若要使用 out 参数,方法定义和调用方法都必须显式使用 out 关键字。


查看评论 | 添加评论
返回顶部 | 返回首页