之前接手老项目的时候有遇到一些的方法参数中使用了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)

    {

        ;

        Console.WriteLine(testInt);



        DoRef(ref testInt);

        Console.WriteLine(testInt);



        DoNotRef(testInt);

        Console.WriteLine(testInt);



        Console.ReadLine();



    }



    public static void DoRef(ref int txt)

    {

        txt = ;

    }

    public static void DoNotRef(int txt)

    {

        txt = ;

    }

}

结果

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

    }

}

结果

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

}

结果

C#中 ref 关键字的认识和理解的更多相关文章

  1. C#中ref关键字的用法总结

    ref表示引用的意思,C#中它有多种用法,这里简单总结一下: 1.按引用传递参数 具体可见:C#中的值传递与引用传递(in.out.ref) 2.引用局部变量 引用局部变量指的是在变量声明时使用ref ...

  2. C#中ref和out的使用与区别

    C#中ref关键字和out关键字所实现的功能差不多,都是指定一个形参按照引用传递而不是实参的副本传递.但是二者适用场景还是有些区别的:out适合用在需要retrun多个返回值的地方,而ref则适合用在 ...

  3. 关于c#中”ref”和”out”关键字的一些理解

    一. 综述(本文内容大部分来自网络,经本人整理而成,仅供学习参考,不免理解错误,欢迎批评指正) 在c#中,方法的参数传递有四种类型: (1) 传值参数(by value) 传值参数无需额外的修饰符.传 ...

  4. 使用C#中的ref关键字,用2个简单例子来说明

    在C#中,如果在方法参数前面加上ref关键字,说明参数传递的是引用,而不是值.如何理解呢? 参数是简单类型的例子 static void Main(string[] args) { string te ...

  5. C#中引用类型的变量做为参数在方法调用时加不加 ref 关键字的不同之处

    ​ 一直以为对于引用类型做为参数在方法调用时加不加 ref 关键字是没有区别的.但是今天一调试踪了一下变量内存情况才发现大有不同. 直接上代码,结论是:以下代码是使用了 ref 关键字的版本.它输出1 ...

  6. 为什么C#中ref和out 关键字 ?

    需求假设:现需要通过一个叫Swap的方法交换a,b两个变量的值.交换前a=1,b=2,断言:交换后a=2,b=1. 现编码如下: class Program   {       static void ...

  7. c#中ref和out 关键字

    问题:为什么c#中要有ref和out?(而java中没有)需求假设:现需要通过一个叫Swap的方法交换a,b两个变量的值.交换前a=1,b=2,断言:交换后a=2,b=1. 现编码如下: class ...

  8. 【转载】理解C语言中的关键字extern

    原文:理解C语言中的关键字extern 最近写了一段C程序,编译时出现变量重复定义的错误,自己查看没发现错误.使用Google发现,自己对extern理解不透彻,我搜到了这篇文章,写得不错.我拙劣的翻 ...

  9. C# 中ref与out关键字区别

    ref 关键字通过引用传递的参数的内存地址,而不是值.简单点说就是在方法中对参数的任何改变都会改变调用方的基础参数中.代码举例: class RefExample { static void Meth ...

随机推荐

  1. 开发工具篇:Git和Github

    开发工具篇:Git和Github Git是什么? Git是目前世界上最先进的分布式版本控制系统.工作原理 / 流程: Workspace:工作区 Index / Stage:暂存区 Repositor ...

  2. 从txt文本内读取数据(逐行读取),执行循环

    如下图,名称为1.txt的文本文件内有链接若干条,预期是循环读取txt文本内链接,而后访问该链接 脚本如下: for line in open('C:\\Users\\Beckham\\Desktop ...

  3. itext5和itext7操作pdf平铺和图层叠加(tiling, and N-upping)

    区别 itext5 生成pdf版本:1.4(Acrobat5.x) itext7 生成pdf版本:1.7(Acrobat8.x) iText7生成的pdf文件大, itext7 Java库更加系统和完 ...

  4. 【原创】(二)Linux进程调度器-CPU负载

    背景 Read the fucking source code! --By 鲁迅 A picture is worth a thousand words. --By 高尔基 说明: Kernel版本: ...

  5. EMC NW NMM to restore MS AG database

    Following last article, how to restore MS AG database , that is in the following: You see ?  Cheer u ...

  6. JavaWeb前置知识 : 动态和静态的区别、两种架构、常见状态码

    JavaWeb程序设计(一) : 前置知识 1.动态网页与静态网页的区别: a.不要和是否有"动感"混为一谈. b.是否随着时间.地点.用户操作的改变而改变 (例如 : 在百度上搜 ...

  7. 什么?接口中方法可以不是抽象的「JDK8接口新语法的深度思考」

    先赞后看,养成习惯 文本已收录至GitHub开源仓库 Lu_JavaNodes 码云仓库地址Lu_JavaNodes,包含教程涉及所有思维导图,案例代码和后续讲解视频,欢迎Star增砖添瓦. 前言 在 ...

  8. jmeter接口测试(登录、注册)

    Jmeter 进行接口测试流程: Jmeter 的下载地址:http://jmeter.apache.org/download_jmeter.cgi 下面举例说明使用流程,有两种参数传递的方式,我们以 ...

  9. Keepalived 配置文件

    keepalived的配置文件: keepalived只有一个配置文件keepalived.conf,里面主要包括以下几个配置区域,分别是global_defs.              全局定义及 ...

  10. 【Java编程思想读书笔记】继承中父类的初始化方式

    继承中父类的初始化方式 p144页有感 一.提出问题 假设有一些类,这些类有继承关系的时候,当初始化一个子类对象,对于该类的父类而言,发生了什么呢?是仅仅只是复制了一个引用还是也会同时new一个父类对 ...