引用类型传参不加 ref 的注意事项
public class MyClass
{
public int Value;
}
//MSDN: http://msdn.microsoft.com/zh-cn/library/s6938f28%28v=vs.80%29.aspx
//引用类型的变量不直接包含其数据;它包含的是对其数据的引用。当通过值传递引用类型的参数时,有可能更改引用所指向的数据,如某类成员的值。
//但是无法更改引用本身的值;也就是说,不能使用相同的引用为新类分配内存并使之在块外保持。
//若要这样做,应使用 ref 或 out 关键字传递参数。
// 引用类型参数没有加ref 试图将参数重新分配到不同的内存位置时,该操作仅在方法内有效,并不影响原始变量
class Program
{
static void Main(string[] args)
{
MyClass m = new MyClass();
m.Value = 1;
Console.WriteLine(m.Value);//Step 1-->1
Test1(m);
Console.WriteLine(m.Value);//Step 3 --> 50
Test2(ref m);
Console.WriteLine(m.Value); //Step 5 -->100
Console.ReadLine();
}
public static void Test1(MyClass m)
{
m.Value = 50;
m = new MyClass();
m.Value = 200;
Console.WriteLine("Func: Test1, m Value = {0}", m.Value);// Step 2 --> 200
}
public static void Test2(ref MyClass m)
{
m.Value = 60;
m = new MyClass();
m.Value = 100;
Console.WriteLine("Func: Test2, m Value = {0}", m.Value);//Step 4 -->100
}
}
{
public int Value;
}
//MSDN: http://msdn.microsoft.com/zh-cn/library/s6938f28%28v=vs.80%29.aspx
//引用类型的变量不直接包含其数据;它包含的是对其数据的引用。当通过值传递引用类型的参数时,有可能更改引用所指向的数据,如某类成员的值。
//但是无法更改引用本身的值;也就是说,不能使用相同的引用为新类分配内存并使之在块外保持。
//若要这样做,应使用 ref 或 out 关键字传递参数。
// 引用类型参数没有加ref 试图将参数重新分配到不同的内存位置时,该操作仅在方法内有效,并不影响原始变量
class Program
{
static void Main(string[] args)
{
MyClass m = new MyClass();
m.Value = 1;
Console.WriteLine(m.Value);//Step 1-->1
Test1(m);
Console.WriteLine(m.Value);//Step 3 --> 50
Test2(ref m);
Console.WriteLine(m.Value); //Step 5 -->100
Console.ReadLine();
}
public static void Test1(MyClass m)
{
m.Value = 50;
m = new MyClass();
m.Value = 200;
Console.WriteLine("Func: Test1, m Value = {0}", m.Value);// Step 2 --> 200
}
public static void Test2(ref MyClass m)
{
m.Value = 60;
m = new MyClass();
m.Value = 100;
Console.WriteLine("Func: Test2, m Value = {0}", m.Value);//Step 4 -->100
}
}