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

C#学习笔记(基础知识回顾)之值类型和引用类型

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

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

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

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

C#学习笔记(基础知识回顾)之值类型与引用类型转换(装箱和拆箱)

C#学习笔记(基础知识回顾)之值传递和引用传递的更多相关文章

  1. jQuery学习笔记 - 基础知识扫盲入门篇

    jQuery学习笔记 - 基础知识扫盲入门篇 2013-06-16 18:42 by 全新时代, 11 阅读, 0 评论, 收藏, 编辑 1.为什么要使用jQuery? 提供了强大的功能函数解决浏览器 ...

  2. SQLServer学习笔记<>.基础知识,一些基本命令,单表查询(null top用法,with ties附加属性,over开窗函数),排名函数

    Sqlserver基础知识 (1)创建数据库 创建数据库有两种方式,手动创建和编写sql脚本创建,在这里我采用脚本的方式创建一个名称为TSQLFundamentals2008的数据库.脚本如下:   ...

  3. three.js学习笔记--基础知识

    基础知识 从去年开始就在计划中的three.js终于开始了 历史介绍 (摘自ijunfan1994的转载,感谢作者) OpenGL大概许多人都有所耳闻,它是最常用的跨平台图形库. WebGL是基于Op ...

  4. Java Script 学习笔记 -- 基础知识

    Java script 概述 java Script 的简介 JavaScript一种直译式脚本语言,是一种动态类型.弱类型.基于原型的语言,内置支持类型.它的解释器被称为JavaScript引擎,为 ...

  5. php学习笔记——基础知识(2)

    9.PHP语句 if 语句 - 如果指定条件为真,则执行代码 if...else 语句 - 如果条件为 true,则执行代码:如果条件为 false,则执行另一端代码 if...else if.... ...

  6. php学习笔记——基础知识(1)

    1.PHP 脚本在服务器上执行,然后向浏览器发送回纯 HTML 结果. 2.基础 PHP 语法 1)PHP 脚本可放置于文档中的任何位置. 2)PHP 脚本以 <?php 开头,以 ?> ...

  7. Redux学习笔记-基础知识

      Redux概述 是什么:Redux是管理状态的容器,提供可预测的状态管理. 怎么做:Redux主要是用来管理组件或者应用的状态,本质上跟一个事件处理器差不多.通过分发action触发reduce来 ...

  8. GO Lang学习笔记 - 基础知识

    Go lang Learn Note 标签(空格分隔): Go Go安装和Go目录 设置环境变量GOROOT和GOPATH,前者是go的安装目录,后者是开发工作目录.go get包只会将包下载到第一个 ...

  9. Validform 学习笔记---基础知识整理

    面对表单的验证,自己写大量的js毕竟不是一个明智的做法.不仅仅是代码很长而且不便于梳理.Validform就是一款开源的第三方验证js的控件,通过添加相应的js以及css能够有效的验证表单,维护起来也 ...

  10. java虚拟机JVM学习笔记-基础知识

    最近使用开发的过程中出现了一个小问题,顺便记录一下原因和方法--java虚拟机 媒介:JVM是每一位从事Java开发工程师必须翻越的一座大山! JVM(Java Virtual Machine)JRE ...

随机推荐

  1. 网站架构:PHP针对并发访问如何优化?

    1.拆表:大表拆小表(垂直拆,水平拆:分表,分区partition,分片sharding),可以在应用层实现,也可以在数据库层面实现一部分:提高系统性能. 2.分库:把表放到不同的数据库,这也是分布式 ...

  2. Utils工具方法集插件详解

    var Utils = function(){}; Utils.text = { stripTags: function (val) { return val.replace(/<\/?[^&g ...

  3. 4. STL编程四

    1. 类模板的默认参数规则: #include <iostream> using namespace std; /* //类模板,不调用不编译(函数):变量还是规范 template< ...

  4. 架构师养成记--21.netty编码解码

    背景 作为网络传输框架,免不了哟啊传输对象,对象在传输之前就要序列化,这个序列化的过程就是编码过程.接收到编码后的数据就需要解码,还原传输的数据. 代码 工厂类 import io.netty.han ...

  5. 达人篇:6.3)试验设计DOE,Design of Experiments

    本章目的:了解DOE,结构工程师为什么学习DOE. 1.前言:结构工程师为什么要学DOE 作者作为一名结构工程师,为什么要学习DOE. 很简单,在第四版FMEA手册中,DOE是重要的探测控制手段.如图 ...

  6. 【算法笔记】B1052 卖个萌

    题目链接:https://pintia.cn/problem-sets/994805260223102976/problems/994805273883951104 #include <math ...

  7. Exponentiation POJ-1001

    http://poj.org/problem?id=1001 //10000000 100000 #include<iostream> #include<cstring> us ...

  8. ArduinoNano卡在上传,无法烧录

    卡在“上传...”.过了很久被告知失败. 上午在开发版管理器中将Arduino AVR Boards从1.6.20升级到1.6.22,出现这个问题. 再安装回1.6.20,问题未被解决. 查阅资料无果 ...

  9. masm32环境配置

    软件: Windows7-32bit visual c++6.0 Masm32 sdk 11 安装: 0x00 || 下载Masm sdk 11并安装,下载路径:http://www.masm32.c ...

  10. 代码版本控制:git使用

    1.https://github.com/ 注册账号 2. 点击 Start a project 3. 4. 5.      Clone or download 6.      安装git 7.    ...