• 默认情况下CLR规定所有方法的参数都按值传递的
• 参数类型分为:值类型参数和引用类型参数
• 参数传递方式:传值方式和传址方式
• Ref和Out的共同:传址传递
• Ref和Out的异同:ref修饰的参数必须在传递前对参数进行初始化;out反之,且必须在参数返回前进行初始化赋值
•在值类型参数上使用out和ref关键字与用传值方式来传递的引用类型参数在某种程度上具有相同的行为.
1.值类型参数传值方式
2.值类型参数传址方式
3.引用类型参数传值方式:可以在方法内改变其值 但不会改变此参数变量的引用对象
4引用类型参数传址方式:可以改变其值 同时也可以改变其对象引用
using System;
namespace ConsoleApplication30
{
class Class1
{
public int x;
public Class1(int z)
{
this.x=z;
}
static void fangfa(ref Class1 k)
{
k.x=300;
k=new Class1(200); //k获得了新对象的引用 //去掉ref修饰时方法内部参数的新引用不会影响方法外部引用
Console.WriteLine(k.x); //所以显示值为200 //200
}
static void Main(string[] args)
{
Class1 k= new Class1(100);
Class1 h=k;
Console.WriteLine(h.x); //100 //100
Console.WriteLine(k.x); //100 //100
fangfa(ref k);
Console.WriteLine(h.x); //300 看来new Class1(100)还存在 但k已经不引用了 //300
Console.WriteLine(k.x); //200 //300
}
}
}
namespace ConsoleApplication30
{
class Class1
{
public int x;
public Class1(int z)
{
this.x=z;
}
static void fangfa(ref Class1 k)
{
k.x=300;
k=new Class1(200); //k获得了新对象的引用 //去掉ref修饰时方法内部参数的新引用不会影响方法外部引用
Console.WriteLine(k.x); //所以显示值为200 //200
}
static void Main(string[] args)
{
Class1 k= new Class1(100);
Class1 h=k;
Console.WriteLine(h.x); //100 //100
Console.WriteLine(k.x); //100 //100
fangfa(ref k);
Console.WriteLine(h.x); //300 看来new Class1(100)还存在 但k已经不引用了 //300
Console.WriteLine(k.x); //200 //300
}
}
}