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; }
}

结果


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM