我们知道,将值类型作为方法参数的时候,只是复制了一个而已,并不能改变其原来的值,方法执行完,参数的周期就算完了
,就会消失了,如果想改变原来的值怎么办的,就比如把引用类型作为参数一样,可以改变原来的值,那是因为它传递过去的
是一个引用,一个指向同一个对象的引用,所有对象的值会改变,如果想让值类型在传递的过程中,也可以这样,改变原来的值,那么就就必须把值类型当做引用类型来传递,也就是在方法中加入ref关键字来修饰参数,先来看看下面的例子
View Code
protected void Page_Load(object sender, EventArgs e)
{
int num = 200;
GetValue(num);
Label1.Text = num.ToString();
}
protected void GetValue(ref int num1)
{
num1 = 100;
}
{
int num = 200;
GetValue(num);
Label1.Text = num.ToString();
}
protected void GetValue(ref int num1)
{
num1 = 100;
}
如果就是这样的话,上面我们说到只是复制了num作为参数使用,但是原来的num并没有因此而改变,所以在此输入num的值还是以前的的值200,不是100,但是加上ref之后就不一样了
View Code
protected void Page_Load(object sender, EventArgs e)
{
int num = 200;
GetValue(ref num);
Label1.Text = num.ToString();
}
protected void GetValue(ref int num1)
{
num1 = 100;
}
{
int num = 200;
GetValue(ref num);
Label1.Text = num.ToString();
}
protected void GetValue(ref int num1)
{
num1 = 100;
}
这样的值就改变num的值,就是100了,总得来说就是把值类型转换成引用类型作为参数传递了,可以改变原来的值
还有另外一个修饰符out,这个主要是用来输出的,确切的说ref和out传递的都是地址,但是唯一的区别就是ref重点的将值传入到方法内,而out则注重于输出,不用初始化,看看下面的例子就明白了
View Code
using System;
namespace ParameterOutSample3_4
{
class AddClass
{
public static void Add(int x, int y, out int z)
{
z = x + y;
}
}
class MyClass
{
public static void Main()
{
int a = 13, b = 19, c; //c未初始化
AddClass.Add(a, b, out c);
Console.WriteLine("a+b={0}", c);
}
}
}
namespace ParameterOutSample3_4
{
class AddClass
{
public static void Add(int x, int y, out int z)
{
z = x + y;
}
}
class MyClass
{
public static void Main()
{
int a = 13, b = 19, c; //c未初始化
AddClass.Add(a, b, out c);
Console.WriteLine("a+b={0}", c);
}
}
}
有时候使用out和ref可以实现相同的功效,最大的区别就在于out重在输出,不把具体的值传递到方法内,在方法外,不用赋值,而ref就重在输入,需要在方法外初始化!
简答总结:
ref与out实现的结果一样,都可以改变原来的值,只是ref需要在方法外赋值,而out不需要在方法外赋值
另外有个简单的用法
if (!int.TryParse(Request.Params["id"] as string, out this.Id))
{
{
}
可以直接赋值判断