之前接手老项目的时候有遇到一些的方法参数中使用了ref关键字加在传参的参数前面的情况。对于新手,这里介绍和讲解一下ref的用法和实际效果。
- CLR中默认所有方法的参数传递方式都是传值,也就是说不管你传递的对象是值类型还是引用类型,在作为参数传入到方法中时,传递的是原对象的副本。无论在方法中对该对象做何更改,都不影响外部的对象。
- 而使用了ref参数之后,传递的是对象的引用
- 对于值类型,传递的是值的引用,可以理解为值的地址
- 对于引用类型,传递的就是变量的引用,同样可以理解成变量的栈地址
值类型对象使用ref参数示例
C# 控制台程序 值类型对象使用ref参数
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
|
class Program
{
static void Main(string[] args)
{
int testInt = 10;
Console.WriteLine(testInt);
DoRef(ref testInt);
Console.WriteLine(testInt);
DoNotRef(testInt);
Console.WriteLine(testInt);
Console.ReadLine();
}
public static void DoRef(ref int txt)
{
txt = 10000000;
}
public static void DoNotRef(int txt)
{
txt = 55555555;
}
} |
结果
![](https://img2018.cnblogs.com/blog/1060719/202001/1060719-20200117172410223-15416875.png)
string类型对象使用ref参数示例
C# 控制台程序 String类型对象使用ref关键字传参
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
|
class Program
{
static void Main(string[] args)
{
string testValue = "origin";
Console.WriteLine(testValue);
UseRef(ref testValue);
Console.WriteLine(testValue);
NotUseRef(testValue);
Console.WriteLine(testValue);
Console.ReadLine();
}
public static void UseRef(ref string txt)
{
txt = "ref txt";
}
public static void NotUseRef(string txt)
{
txt = "not ref txt";
}
}
|
结果
![](https://img2018.cnblogs.com/blog/1060719/202001/1060719-20200117172410223-15416875.png)
类对象使用ref传参示例
C# Code 控制台程序 类对象使用ref关键字传参
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33
|
class Program
{
static void Main(string[] args)
{
TestModel t0 = new TestModel()
{
Text = "test"
};
Console.WriteLine(t0.Text);
UseRef(ref t0);
Console.WriteLine(t0.Text);
NotUseRef(t0);
Console.WriteLine(t0.Text);
Console.ReadLine();
}
public static void UseRef(ref TestModel tModel)
{
tModel.Text = "use ref";
}
public static void NotUseRef(TestModel tModel)
{
tModel.Text = "not use ref";
}
}
public class TestModel
{
public string Text { get; set; }
} |
结果
|