C# 中的数据有两种类型:引用类型(reference types)和值类型(value types)。 简单类型(包括int, long, double等)和结构(structs)都是值类型,而其他的类都是引用类型。 简单类型在传值的时候会做复制操作,而引用类型只是传递引用,就像 C++ 中的指针一样。
ref 关键字使参数按引用传递。其效果是,当控制权传递回调用方法时,在方法中对参数所做的任何更改都将 反映在该变量中。
若要使用 ref 参数,则方法定义和调用 方法都必须显式使用 ref 关键字.
例(转):
public class MyClass
{
public int Value;
}
// ----------------------------------------
// Tester methods
public static void TestRef(ref MyClass m1)
{
// 这里的 m1 也就相当于大家所说的指向指针的指针:
// m1 指向 Main 中的 m,而 m 则指向那个实际的 MyClass 的实例
// 相当于 C++ 中的
// MyClass** m1 = &m;
// (*m1)->Value = 10;
//
m1.Value = 10;
}
public static void TestNoRef(MyClass m1)
{
// 这里是一个普通的传递引用类型的例子。相当于:
// MyClass m1 = m;
// m1.Value = 20;
//
// m1 复制了 m 中的内容,也就是说现在 m1 也和 m 一样,指向了 m 指向的实例
// 所以这里对 m1 的修改也会影响到 Main 中的 m。
//
m1.Value = 20;
}
public static void TestCreateRef(ref MyClass m1)
{
// 这里的 m1 也是一个指向引用的引用:
// m1 指向 Main 中的 m,而 m 则指向那个实际的 MyClass 的实例
// 相当于 C++ 中的
// MyClass** m1 = &m;
// *m1 = new MyClass();
// (*m1)->Value = 100;
// 在上面的 *m1 = new MyClass() 这个调用的时候,实际上只是将 Main 中 m 的值(引用)给修改了,
// 也就是说现在 m1 指向 Main 中的 m,而 m 现在则指向了这个新生成的实例。
// 所以这里 m1.Value = 100 是会影响到 Main 中的结果的
//
m1 = new MyClass();
m1.Value = 100;
}
public static void TestCreateNoRef(MyClass m1)
{
// 在这个方法里面,我们新申明了一个 MyClass 的实例,而让 m1 指向了这个实例
// 这时候,实际上将 m1 的值修改了, m1 和 Main 中的 m 各自指向不同的实例
// 所以对 m1 做的任何修改都不会影响到 m 了
//
m1 = new MyClass();
m1.Value = 200;
}
public static void Main()
{
MyClass m = new MyClass();
m.Value = 1;
TestRef(ref m);
Console.WriteLine(m.Value);
TestNoRef(m);
Console.WriteLine(m.Value);
TestCreateRef(ref m);
Console.WriteLine(m.Value);
TestCreateNoRef(m);
Console.WriteLine(m.Value);
}
例二:
[STAThread]
static void Main(string[] args)
{
TempClass m_class1 = new TempClass();
m_class1.m_member = 0;
TempClass m_class2 = m_class1;
TempClass m_class3 = m_class1;
TempClass m_class4 = m_class1;
ChangeData2(ref m_class2, m_class2); //m_class1.m_member:0; m_class2.m_member:41
ChangeData3(m_class3); //m_class3.m_member:0
ChangeData4(ref m_class4); //m_class4.m_member:44
}
static void ChangeData2(ref TempClass i_obj1,TempClass i_obj2)
{
i_obj1 = new TempClass();
i_obj1.m_member = 41;
i_obj2 = new TempClass();
i_obj2.m_member = 42;
}
static void ChangeData3(TempClass i_obj1) //相当于值传递了
{
i_obj1 = new TempClass();
i_obj1.m_member = 43;
}
static void ChangeData4(ref TempClass i_obj1)
{
i_obj1 = new TempClass();
i_obj1.m_member = 44;
}
}
class TempClass
{
public int m_member;
}