你必须知道的值传递和引用传递
C#中默认使用的是值传递,加ref关键词则标记为引用传递。两者的差别是值传递是传递标识符所代表的变量的副本,而引用传递是传递的本身。以此概念来推敲值类型和引用类型在两种不同传递方式下的区别,这可能是很多人都忽视的,下面的例子表达了这些区别。
using System;
namespace TestMethodParams
{
/// <summary>
/// Class1 的摘要说明。
/// </summary>
class Class1
{
/// <summary>
/// 应用程序的主入口点。
/// </summary>
[STAThread]
static void Main(string[] args)
{
//
// TODO: 在此处添加代码以启动应用程序
//
int i = 0;
//值类型的值传递
ValueTypeTransByVale(i);
Console.WriteLine("值类型的值传递:");
Console.WriteLine(i);
//值类型的引用传递
ValueTypeTransByRef(ref i);
Console.WriteLine("值类型的引用传递:");
Console.WriteLine(i);
MyClass m = new MyClass();
//引用类型的值传递1
m.X = 0;
RefTypeTransByValue1(m);
Console.WriteLine("引用类型的值传递1:");
Console.WriteLine(m.X);
//引用类型的值传递2
m.X = 0;
RefTypeTransByValue2(m);
Console.WriteLine("引用类型的值传递2:");
Console.WriteLine(m.X);
//引用类型的引用传递1
m.X = 0;
RefTypeTransByRef1(ref m);
Console.WriteLine("引用类型的引用传递1:");
Console.WriteLine(m.X);
//引用类型的引用传递2
m.X = 0;
RefTypeTransByRef2(ref m);
Console.WriteLine("引用类型的引用传递2:");
Console.WriteLine(m.X);
Console.Read();
}
static void ValueTypeTransByVale(int i)
{
i = 100;
}
static void ValueTypeTransByRef(ref int i)
{
i = 100;
}
static void RefTypeTransByValue1(MyClass m)
{
m.X = 100;
}
static void RefTypeTransByValue2(MyClass m)
{
m = new MyClass();
m.X = 100;
}
static void RefTypeTransByRef1(ref MyClass m)
{
m.X = 100;
}
static void RefTypeTransByRef2(ref MyClass m)
{
m = new MyClass();
m.X = 100;
}
}
public class MyClass
{
public int X;
}
}
using System;
namespace TestMethodParams
{
/// <summary>
/// Class1 的摘要说明。
/// </summary>
class Class1
{
/// <summary>
/// 应用程序的主入口点。
/// </summary>
[STAThread]
static void Main(string[] args)
{
//
// TODO: 在此处添加代码以启动应用程序
//
int i = 0;
//值类型的值传递
ValueTypeTransByVale(i);
Console.WriteLine("值类型的值传递:");
Console.WriteLine(i);
//值类型的引用传递
ValueTypeTransByRef(ref i);
Console.WriteLine("值类型的引用传递:");
Console.WriteLine(i);
MyClass m = new MyClass();
//引用类型的值传递1
m.X = 0;
RefTypeTransByValue1(m);
Console.WriteLine("引用类型的值传递1:");
Console.WriteLine(m.X);
//引用类型的值传递2
m.X = 0;
RefTypeTransByValue2(m);
Console.WriteLine("引用类型的值传递2:");
Console.WriteLine(m.X);
//引用类型的引用传递1
m.X = 0;
RefTypeTransByRef1(ref m);
Console.WriteLine("引用类型的引用传递1:");
Console.WriteLine(m.X);
//引用类型的引用传递2
m.X = 0;
RefTypeTransByRef2(ref m);
Console.WriteLine("引用类型的引用传递2:");
Console.WriteLine(m.X);
Console.Read();
}
static void ValueTypeTransByVale(int i)
{
i = 100;
}
static void ValueTypeTransByRef(ref int i)
{
i = 100;
}
static void RefTypeTransByValue1(MyClass m)
{
m.X = 100;
}
static void RefTypeTransByValue2(MyClass m)
{
m = new MyClass();
m.X = 100;
}
static void RefTypeTransByRef1(ref MyClass m)
{
m.X = 100;
}
static void RefTypeTransByRef2(ref MyClass m)
{
m = new MyClass();
m.X = 100;
}
}
public class MyClass
{
public int X;
}
}