博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C#学习笔记(基础知识回顾)之值传递和引用传递
阅读量:5222 次
发布时间:2019-06-14

本文共 2085 字,大约阅读时间需要 6 分钟。

一:要了解值传递和引用传递,先要知道这两种类型含义,可以参考上一篇

二:给方法传递参数分为值传递和引用传递。

 2.1在变量通过引用传递给方法时,被调用的方法得到的就是这个变量,更准确的说,是指向内存中变量的指针。所以方法内部对变量进行的任何改变在方法退出后仍然有效。而如果变量通过值传递给方法,被调用的方法得到的是变量的一个相同副本,也就是说方法退出后,对变量进行的修改会丢失。

  2.2值类型的值传递:值类型的变量包含的是实际数据,作为参数传递的是数据本身的副本。如下,int类型通过值传递给方法,对应方法对该值所做的任何改变都没有改变原先int对象的值。

 
 

  2.3通过引用传递值类型:传递的不是值类型的值,而是对值类型的引用,如下,参数i不是int类型,而是对num的引用,方法内部i加一时,实际是i所引用的项num。所以i加一也就修改了num的值。(个人理解是:AddOne(ref num)相当于传递了num的指针104524728,而AddOne方法中对i的操作,相当于操作指针所指向的值,即num的值)。

 

 

 

  2.4:通过值传递引用类型。引用类型的变量不直接包含其数据,他包含的是对数据的引用。通过值传递引用类型的参数时,会改变该引用所指向的数据值,但是无法改变引用本身的值。示例代码如下:

  2.4.1:下面的示例演示通过值向 AddOne方法传递引用类型的参数 str。由于该参数是对 str的引用,所以AddOne方法内的操作会更改str的值。

 

class Program    {        static void Main(string[] args)        {            StringBuilder str = new StringBuilder();            str.Append("hello");            AddOne(str);            Console.WriteLine("num的值为:" + str);//输出值为hello,word            Console.ReadKey();        }        public static void AddOne(StringBuilder sb)        {            sb.Append(",world");        }    }

 

 

 

  2.4.2通过值传递引用类型时,试图将参数重新分配到不同的内存位置时,该操作仅在方法内有效,并不影响原始变量。如下代码:

 

class Program    {        static void Main(string[] args)        {            StringBuilder str = new StringBuilder();            str.Append("hello");            AddOne(str);            Console.WriteLine("str的值为:" + str);//输出值为hello            Console.ReadKey();        }        public static void AddOne(StringBuilder sb)        {            sb = new StringBuilder();            sb.Append(",world");        }    }
View Code

 

 

 

  2.5:通过引用传递引用类型。其实是传递其引用地址的引用,类似于指针的指针。引用传递引用类型如果创建一个新的实例会影响原来的引用类型。代码如下

 

class Program    {        static void Main(string[] args)        {            StringBuilder str = new StringBuilder();            str.Append("hello");            AddOne(ref str);            Console.WriteLine("str的值为:" + str);//输出值为,world            Console.ReadKey();        }        public static void AddOne(ref StringBuilder sb)        {            sb = new StringBuilder();            sb.Append(",world");        }    }
View Code

 

 

三:关于值类型和引用类型的转换可看下一篇:

 

 

 

转载于:https://www.cnblogs.com/weity/p/6047668.html

你可能感兴趣的文章
django ORM创建数据库方法
查看>>
创建Oracle synonym 详解
查看>>
php7 新特性整理
查看>>
RabbitMQ、Redis、Memcache、SQLAlchemy
查看>>
linux查看端口占用
查看>>
hdu - 1226 超级密码 (bfs)
查看>>
Sql常见面试题 受用了
查看>>
知识不是来炫耀的,而是来分享的-----现在的人们却…似乎开始变味了…
查看>>
CSS背景颜色、背景图片、平铺、定位、固定
查看>>
口胡:[HNOI2011]数学作业
查看>>
我的第一个python web开发框架(29)——定制ORM(五)
查看>>
中国剩余定理
查看>>
基础笔记一
查看>>
uva 10137 The trip
查看>>
Count Numbers
查看>>
编写高质量代码改善C#程序的157个建议——建议110:用类来代替enum
查看>>
网卡bond技术
查看>>
UITabbarController的UITabbarItem(例:"我的")点击时,判断是否登录
查看>>
UNIX基础知识之输入和输出
查看>>
【洛谷 P1666】 前缀单词 (Trie)
查看>>