C# REF关键字

 

之前接手老项目的时候有遇到一些的方法参数中使用了ref关键字加在传参的参数前面的情况。对于新手,这里介绍和讲解一下ref的用法和实际效果。

  • CLR中默认所有方法的参数传递方式都是传值,也就是说不管你传递的对象是值类型还是引用类型,在作为参数传入到方法中时,传递的是原对象的副本。无论在方法中对该对象做何更改,都不影响外部的对象。
  • 而使用了ref参数之后,传递的是对象的引用
    1. 对于值类型,传递的是值的引用,可以理解为值的地址
    2. 对于引用类型,传递的就是变量的引用,同样可以理解成变量的栈地址

值类型对象使用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; }

}

结果
技术图片