4.C#基础篇-->变量
| 一.前言 |
变量的类型划分即内存中的存放位置如图:

变量的生命周期如图:

| 二.实参和形参 |
形参是声明在方法的参数列表中。和方法体中的其他变量不同,参数在方法体外定义并在方法体开始之前初始化。
实参是用于初始化形参的表达式或者变量。当代码调用一个方法时,形参的值必须在方法体执行之前被初始化。
| 三.值参数 |
什么是值参数?默认类型的参数称为值参数。
值参数代码举例如图::
值参数特征:
1.在方法被调用之前,做为实参的a1和a2已经在栈中了。
2.随着方法的开始,系统在栈中为形参分配空间,并从实参复制。因为a1是引用类型,所以引用被复制,结果实参和形参都引用堆中的同一个对象;因为a2是值类型,所以值被复制,产生一个独立数据项;
3.在方法的结尾,f2和对象f1的字段都被加上5。
4.方法执行后,形参被从栈中弹出。a2值类型,它的值不受方法行为影响;a1,引用类型,但它的值被方法的行为改变了;

| 四.引用参数 |
什么是引用参数?使用引用参数时,必须在方法的声明和调用中都使用ref修饰符。实参必须是变量,在用作实参前必须被赋值。如果是引用类型,可以赋值一个引用或者NULL。
下图阐明了引用参数的声明和调用语法:

引用参数代码举例如图:
引用参数特征:
1.不在栈中为形参分配新的内存。
2.形参的名称相当于实参变量的别名,引用与实参相同的内存位置。
既然形参和实参引用相同的内存位置,则在方法执行期间,形参所做的任何改变在方法完成之后通过实参变量都是可见的。

| 五.输出参数 |
什么是输出参数?用于从方法体内把数据传出到调用代码。必须在方法的声明和调用中都使用out修饰符。实参必须是变量,在用作实参前非必须被赋值。但是在方法体中实参在被读取之前必须被赋值,每个输出参数在方法返回之前必须被赋值。
下图阐明了输出参数的声明和调用语法:

输出参数代码举例如图:
输出参数特征:
1.不在栈中为形参分配新的内存。
2.形参的名称相当于实参变量的别名,引用与实参相同的内存位置。
既然形参和实参引用相同的内存位置,则在方法执行期间,形参所做的任何改变在方法完成之后通过实参变量都是可见的。

| 六.参数数组 |
什么是参数数组?允许零个或者多个实参对应一个特殊的形参。重点如下:
1.参数列表中只能有一个参数数组。
2.如果有,必须是在列表的最后一个。
3.在数据类型前,使用params修饰符。
4.在数据类型后,放置一个方括号。
5.由于数组是引用类型,所以它的所有数据项都存放在堆中。
如何调用拥有数组参数的方法?有两个方法提供实参:
1.逗号分隔的该数据类型的元素的列表。
2.一个该数据类型元素的一维数组。
第一种调用可以被称为延伸式。这种形式在调用中使用分离的实参。ListInts的声明可以匹配下面所有的方法调用。

在使用一个为参数数组分离实参的调用时,编译器做了下面的事:
1.接受实参列表,用它们在堆中创建并初始化了一个数组。
2.把数组的引用保存在栈中的形参里。
3.如果在对应的形参数组的位置没有实参,编译器会创建一个有零个元素的数组来使用。

1.方法调用前,三个实参已经在栈中。
2.在方法的开始,三个实参被用于初始化堆中的数组,并且数组的引用被赋值给了形参invals。
3.在方法的内部,方法对数组中的值进行修改。
4.在方法结束后,形参失效。
关于参数数组,重点是当数组在堆中被创建的时候,实参的值被复制到数组中。这方面它想值参数。
1.如果数组参数是值类型,那么值被复制,实参不受方法影响。
2.如果数组参数是引用类型,那么引用被复制,实参会受到方法的影响。

第二种调用,即数组做为参数。这时候编译器会使用你的数组,而不是创建一个。

这里要注意,数组是一个引用类型,所以myarr的元素被修改了。
4.C#基础篇-->变量的更多相关文章
- js基础篇——变量
a.变量类型 变量类型 构造函数 举例 类型检测typeof 字符串 function String() var t = "chua"; var m = new String(&q ...
- VBS基础篇 - 变量
VBScript只有一种数据类型 —— Variant,它是根据上下文来判断是数字还是字符串.因为Variant是VBScript中唯一的数据类型,所以它也是VBScript中所有函数的返回值的数据类 ...
- Linux Shell基础篇——变量
一.Shell中的变量 注:这里所说的Shell是Bash Shell,我姑且统称为Shell. Shell中的变量分为用户自定义变量.环境变量.位置参数变量.预定义变量.在Shell中,变量的默认类 ...
- java学习笔记(基础篇)—变量与表达式
一:局部变量和实例变量 定义变量是指设定变量的数据类型和变量的名字,Java语言要求变量遵循先定义,再初始化,然后使用的规则. 作用域:指它的存在范围,只有在这个范围内,程序代码才能访问它. 变量的生 ...
- Java学习 (七)基础篇 变量
变量 变量顾名思义,就是可以变化的量 Java是一种强类型语言,每个变量都必须声明其类型 Java变量是程序中最基本的存储单位,其要素包括变量名.变量类型和作用域 type varName [=val ...
- 小猪猪逆袭成博士之C++基础篇(一)数据精度、强制类型转换、变量命名规则
小猪猪逆袭成博士之C++基础篇(一) 关键词: 数据精度.强制类型转换.变量命名规则 综述: 1.大多数编程语言通过两种方式来进一步补充其特征:一是赋予程序员自定义数据类型的权利(C++中的类):二是 ...
- Python学习笔记——基础篇【第一周】——变量与赋值、用户交互、条件判断、循环控制、数据类型、文本操作
目录 Python第一周笔记 1.学习Python目的 2.Python简史介绍 3.Python3特性 4.Hello World程序 5.变量与赋值 6.用户交互 7.条件判断与缩进 8.循环控制 ...
- shell重温---基础篇(shell变量&字符串以及git GUI运行shell脚本方式)
既然是基础篇那肯定是需要对shell的各种需要注意的基本点进行说明了.接下来就是show time... shell呢,是一个用C语言编写的应用程序,是用户使用linux的桥梁.所以呢,他既是一 ...
- C#多线程之基础篇3
在上一篇C#多线程之基础篇2中,我们主要讲述了确定线程的状态.线程优先级.前台线程和后台线程以及向线程传递参数的知识,在这一篇中我们将讲述如何使用C#的lock关键字锁定线程.使用Monitor锁定线 ...
随机推荐
- 面向对象的 JavaScript
面向对象的javascript 一.创建对象 创建对象的几种方式: var obj = {}; var obj = new Object(); var obj = Object.create(fath ...
- POJ C程序设计进阶 编程题#1:计算矩阵边缘之和
编程题#1:计算矩阵边缘元素之和 来源: POJ (Coursera声明:在POJ上完成的习题将不会计入Coursera的最后成绩.) 注意: 总时间限制: 1000ms 内存限制: 65536kB ...
- 初识 css3中counter属性
最近看到counter属性,好奇是做什么用的,于是去查了查. 1.简单介绍 counter是为css中插入计数器.[注明]在CSS2.1中counter()只能被使用在content属性上.关于浏览器 ...
- C#通过WinAPI获取内存信息,32位64位可用
using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Runti ...
- (转载)实现QQ侧滑边栏
Android ViewDragHelper实现QQ侧滑边栏 移动手机版的QQ的左边侧栏,有一个特殊的交互设计效果:当用户手指向右或向左滑动时,QQ的左边会弹出或收缩一个侧滑的边栏.这种效果简单的做法 ...
- js实现选项卡功能
1.css .liclick{ border: 1px black solid; background: #fff; float: left; width: 80px; height: 35px; l ...
- 用C#写的读写CSV文件
用C#写的读取CSV文件的源代码 CSV文件的格子中包含逗号,引号,换行等,都能轻松读取,而且可以把数据转化成DATATABLE格式 using System; using System.Text; ...
- 在EF的code frist下写稳健的权限管理系统:仓储设计(三)
public class BaseRepository<T>:IBaseRepository<T> where T : class { protected EfConnecti ...
- angularjs2 学习笔记(二) 组件
angular2 组件 首先了解angular2 组件的含义 angular2的应用就是一系列组件的集合 我们需要创建可复用的组件供多个组件重复使用 组件是嵌套的,实际应用中组件是相互嵌套使用的 组件 ...
- public、private、protected 与 默认 等访问修饰符
1)public(公共的):被public修饰的属性和方法可以被所有类访问. 2)private(私有的):被private修饰的属性和方法只能在改类的内部使用. 3)protected(受保护的): ...