一晃大学四年要过去了,期间乱点了很多技能点, 导致每一项技能都只是处于入门阶段。为了将C#作为我的主要技能,准备恶补相关姿势(知识),通过各种技术论坛的推荐,找到了《C#图解教程》这本书。初一看,感觉只不过都只是把知识罗列了出来而已,而且很多都是已知的,但是看到后面,发现它把很多以前模糊不清的知识变得清晰了,而且还学到了以前都没有学到的新知识。特别结合图片的解释,让初学者更加容易理解。

不多说,这次想将本书第五章方法有关参数相关知识进行梳理。

1、参数知识点

参数类型有值参数、引用参数、输出参数、参数数组这么四种。上面的都是位置参数,另外C#还提供了命名参数和可选参数(和python极其类似)。

2、值参数

使用值参数,通过将实参的值复制到形参的方式把数据传递给方法。方法调用的时候,做了如下的操作:

1、在栈中为形参分配空间

2、讲实参的值复制给形参

我们来举一个例子,看代码:

结果如下:

好了,我们用图解的形式来解释下,它是如何在堆栈中执行的:

一句话说:如果方法内部对参数做了赋值操作(引用类型内部成员赋值),跳出方法后,值类型参数还是不变,引用类型参数值会发生改变。

3、引用参数

使用引用参数,需要这两点

1、必须在方法的声明和调用中都使用def修饰符;

2、实参必须是变量,在用作实参之前必须被赋值。如果是引用类型变量,可以赋值一个引用或null。

对于值参数而言,系统会在栈上为形参分配内存。而引用参数会具有以下这两个特点

1、不会为形参在栈上分配内存空间;

2、形参的参数名将作为实参的别名,指向相同的内存位置。

我们来举一个例子,看代码:

结果如下:

好了,我们用图解的形式来解释下,它是如何在堆栈中执行的:

一句话说:如果方法内部对参数做了赋值操作,跳出方法后,值类型参数和引用类型参数值都会发生改变。

3、引用类型作为值参数和引用参数

之前看到两个例子,引用类型作为值参数和引用参数结果都会发生改变。但是要注意一点的是,他们改变的都是引用类型内部成员的值。

现在我们来看看,如果对引用类型本身赋值一个新对象会发生什么。我想通过上面两幅图应该也很容易知道了。

下面代码展示引用类型作为值参数传递:

结果如下:

好了,我们用图解的形式来解释下,它是如何在堆栈中执行的:

下面代码展示引用类型作为引用参数传递(只加了ref):

结果如下:

好了,我们用图解的形式来解释下,它是如何在堆栈中执行的:

总结:本质来说值参数实际就将实参在栈上复制了一份给形参,方法内部对形参做操作,执行方法后,会在栈上自动销毁,而实参不受影响。而引用参数则是相当于实参的别名,方法内部对实参做操作,执行方法后,实参受影响。

C#图解教程-方法参数笔记(上)的更多相关文章

  1. 《C#图解教程》读书笔记之三:方法

    本篇已收录至<C#图解教程>读书笔记目录贴,点击访问该目录可获取更多内容. 一.方法那些事儿 (1)方法的结构:方法头—指定方法的特征,方法体—可执行代码的语句序列: (2)方法的调用:参 ...

  2. 《C#图解教程》读书笔记之四:类和继承

    本篇已收录至<C#图解教程>读书笔记目录贴,点击访问该目录可获取更多内容. 一.万物之宗:Object (1)除了特殊的Object类,其他所有类都是派生类,即使他们没有显示基类定义. ( ...

  3. 《C#图解教程》读书笔记之五:委托和事件

    本篇已收录至<C#图解教程>读书笔记目录贴,点击访问该目录可获取更多内容. 一.委托初窥:一个拥有方法的对象 (1)本质:持有一个或多个方法的对象:委托和典型的对象不同,执行委托实际上是执 ...

  4. 《C#图解教程》读书笔记之六:接口和转换

    本篇已收录至<C#图解教程>读书笔记目录贴,点击访问该目录可获取更多内容. 一.接口那点事儿 (1)什么是接口? 一组函数成员而未实现的引用类型.只有类和结构能实现接口. (2)从ICom ...

  5. 《C#图解教程》读书笔记之二:存储、类型和变量

    本篇已收录至<C#图解教程>读书笔记目录贴,点击访问该目录可获取更多内容. 一.类型初窥:掀起你的盖头来 (1)C程序是一组函数和数据类型,C++程序是一组函数和类,而C#程序是一组类型声 ...

  6. 《C#图解教程》读书笔记之一:C#和.NET框架

    本篇已收录至<C#图解教程>读书笔记目录贴,点击访问该目录可获取更多内容. 一.在.NET之前的编程世界 C#语言是在微软公司的.NET框架上开发程序而设计的,首先作者给大家纠正了一下C# ...

  7. C#温故知新:《C#图解教程》读书笔记系列

    一.此书到底何方神圣? 本书是广受赞誉C#图解教程的最新版本.作者在本书中创造了一种全新的可视化叙述方式,以图文并茂的形式.朴实简洁的文字,并辅之以大量表格和代码示例,全面.直观地阐述了C#语言的各种 ...

  8. win8.1系统的安装方法详细图解教程

    win8.1系统的安装方法详细图解教程 关于win8.1系统的安装其实很简单 但是有的童鞋还不回 所以今天就抽空做了个详细的图解教程, 安装win8.1系统最好用U盘安装,这样最方便简单 而且系统安装 ...

  9. 菜鸟教程之学习Shell script笔记(上)

    菜鸟教程之学习Shell script笔记 以下内容是,学习菜鸟shell教程整理的笔记 菜鸟教程之shell教程:http://www.runoob.com/linux/linux-shell.ht ...

随机推荐

  1. 极光推送助推视频App,打造最活跃手机新媒体平台

    移动应用能够帮助吸引更多的新用户,增加用户互动和对话.但你得让用户想起你,如何在一部手机上数十个App中脱颖而出,是考验App运营的关键之处.为了打造一个成功的App,开发者需要着眼长远,不应局限于其 ...

  2. 安全体系(二)——RSA算法详解

    本文主要讲述RSA算法使用的基本数学知识.秘钥的计算过程以及加密和解密的过程. 安全体系(零)—— 加解密算法.消息摘要.消息认证技术.数字签名与公钥证书 安全体系(一)—— DES算法详解 1.概述 ...

  3. 关于Dapper.NET的相关论述

    年少时,为何不为自己的梦想去拼搏一次呢?纵使头破血流,也不悔有那年少轻狂.感慨很多,最近事情也很多,博客也很少更新了,毕竟每个人都需要为自己的生活去努力. 最近在一个群里遇到一个人说的话,在这里不再赘 ...

  4. Gradle之恋-任务2

    由于任务作为Gradle的核心功能模块,多花点精力是值得的,本文继上一篇主要涉及到:任务的执行顺序.为任务添加组和描述.跳过任务.扩展任务属性.定义默认任务. 任务顺序 如果构建(build)不能在清 ...

  5. AlloyTouch.js 源码 学习笔记及原理说明

    alloyTouch这个库其实可以做很多事的, 比较抽象, 需要我们用户好好的思考作者提供的实例属性和一些回调方法(touchStart, change, touchMove, pressMove, ...

  6. Implement Stack using Queues leetcode

    Implement the following operations of a stack using queues. push(x) -- Push element x onto stack. po ...

  7. LoadRunner如何进行移动端性能测试

    1.录制脚本 1.1 创建脚本:新建一个用户脚本,选择Mobile Application 使用管理员身份打开VirtualUser Generator,点击[文件]->[新建脚本和解决方案], ...

  8. 1635: [Usaco2007 Jan]Tallest Cow 最高的牛

    1635: [Usaco2007 Jan]Tallest Cow 最高的牛 Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 383  Solved: 211 ...

  9. AVFoundation之如何从摄像头获取图像

    前言: 最近项目有个需求是对试图对手机密码进行强破解的人进行拍照(通过摄像头截图),因为之前没做过,所以一堆坑.现在就把我的经验都分享出来,希望后来人不用再踏上坑途中. 直接上代码: // 创建会话 ...

  10. Spark结构式流编程指南

    Spark结构式流编程指南 概览 Structured Streaming 是一个可拓展,容错的,基于Spark SQL执行引擎的流处理引擎.使用小量的静态数据模拟流处理.伴随流数据的到来,Spark ...