【原】 C#关键字 Ref 学习笔记
早上 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();
}
}
}
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 关键字。