1)形参

形参顾名思义就是形式上的参数,不是实际的参数,它代替实际传入方法的值。在方法体代码中代表了值本身参与运算。形参定义于参数中,它不同于方法体内局部变量,因为是一个变量,在它的作用域内不允许存在一个同名的局部变量,不管他们的类型是否相同,都是不允许出现同名的。

看下面的代码示例:

 //这其中的strName就是一个形参也是一个变量,不允许出现同名的局部变量
public void SayHelloTo(string strName)
{
Console.WriteLine("我的名字是{0}", strName);
}

形参的特点:

①形参是一个变量,它具有变量的全部特点。②方法的形参可以有多个,形参直接使用逗号进行隔开,即使类型相同的多个参数也不可以合并声明。

2)实参

实参是相对于形参而言的,形参是实际值的“替身”,这个替身所代表的实际值即为实参。实际值可以是一个具体的值,也可以是一个变量

看下面的代码示例:

 static void Main(string[] args)
{
Program pro = new Program();
int nNum = ;
//当调用Add方法时,传进去两个参数,第一个是实际的值,
//第二个nNum是变量,但是在传入方法时已经初始化
int nResult = pro.Add(, nNum);
} //这里的a,b即为所谓的形参
public int Add(int a, int b)
{
return a + b;
}

①实参用于初始化形参的实际值或者表达式②实参位于要调用的方法参数列表中。

3)按值传递参数

值参数是通过将实参的值复制到形参。来实现将值传递到方法,也就是所谓的按值传递,当方法被调用是,CLR做如下操作:

①在托管栈堆中为形参分配空间 ②将实参的值复制到形参

其中,在值参数中,实参也可以是任何计算结果满足类型要求的表达式,不一定是变量。

看下面的代码示例:

 static void Main(string[] args)
{
Program pro = new Program();
//int nNum = 10;
//当调用Add方法时,传进去两个参数,第一个是实际的值,
//第二个nNum是变量,但是在传入方法时已经初始化
//int nResult = pro.Add(20, nNum);
int i = ;
int w = ;
//在这里i * 2和(w+10)/10充当了实参的角色
int nResult = pro.Add(i * , (w + ) / );
Console.WriteLine(nResult);
} //这里的a,b即为所谓的形参
public int Add(int a, int b)
{
return a + b;
}

下面看一段代码,分别观察形参,实参在托管堆和托管栈中的分配和使用情况

 class Program
{
static void Main(string[] args)
{
Program pro = new Program();
Rectangle rectange = new Rectangle();
int myValue = ; //这里的rectange,myValue是实参
pro.CalculateArea(rectange, myValue);//调用方法
} //这里的(Rectangle rect,int value)是形参
public void CalculateArea(Rectangle rect,int value)
{
rect.Length += ;
rect.width += ;
rect.Area = rect.Length * rect.width;
value++;
}
} //一个矩形类
public class Rectangle
{
public int Length = ;
public int width = ;
public int Area;
}

①在方法被调用前:系统在栈中为Rectangle类的实例rectange和值类型myValue分配空间,其中引用类型rectange指向堆中的Rectangle对象实例,myValue是值类型,因此其值位于托管栈中。演示图如下

②方法调用开始时:实参将值复制到CalculateArea的形参,其中rectange为引用类型,因为复制一个新的引用——rect,此刻这两个引用都指向同一个对象,myValue是值类型,因此可以直接复制其值——value。演示图如下:

③方法调用过程中,改变引用所指向对象的length字段和width字段,以及value值自增1

④方法调用以后,形参rect和value被从栈中弹出。myValue是值类型,他的值并没有改变(改变的是形参value);rectange是引用类型,对它所作的修改实际是对托管堆中的对象做的修改,其值未修改后的值。

要明白值传递参数,主要明白值类型和引用类型在托管栈和托管堆中的作用状态。这样理解起来就非常的容易。

C#形参,实参,值传递参数,引用传递参数,输出参数,参数数组的学习的更多相关文章

  1. java基础 - 形参和实参,值传递和引用传递

    形参和实参 形参:就是形式参数,用于定义方法的时候使用的参数,是用来接收调用者传递的参数的. 形参只有在方法被调用的时候,虚拟机才会分配内存单元,在方法调用结束之后便会释放所分配的内存单元. 因此,形 ...

  2. 【Java思考】Java 中的实参与形参之间的传递到底是值传递还是引用传递呢?

    科普: 值传递(pass by value)是指在调用函数时将实际参数复制一份传递到函数中,这样在函数中如果对参数进行修改,将不会影响到实际参数. 引用传递(pass by reference)是指在 ...

  3. 【Java】 参数的传递:值传递与引用传递讨论

    内容稍多,可直接看第4点的讨论结果 前言 在涉及到传递参数给方法时,容易出现一些参数传递错误的问题,这就涉及到了参数的传递问题,必须搞清楚:参数是如何传递到方法中的?一般来说,参数的传递可以分为两种: ...

  4. JAVA方法中参数到底是值传递还是引用传递

    当一个对象被当作参数传递到一个方法后,在此方法内可以改变这个对象的属性,那么这里到底是值传递还是引用传递? 答:是值传递.Java 语言的参数传递只有值传递.当一个实例对象作为参数被传递到方法中时,参 ...

  5. Java参数是值传递还是引用传递?

    先来看看参数是如何传递的. 一.参数的传递 1.基本类型的参数传递 public static void main(String[] args) { int a = 1; fun(a); } priv ...

  6. Java调用函数传递参数到底是值传递还是引用传递

    今天翻看微信上有关Java技术的公众号时,看到了一篇关于Java中值传递的问题,文章讨论了在Java中调用函数进行传参的时候到底是值传递还是引用传递这个面试时会问到的问题.之前也接触过类似的问题,但只 ...

  7. 深入理解python中函数传递参数是值传递还是引用传递

    深入理解python中函数传递参数是值传递还是引用传递 目前网络上大部分博客的结论都是这样的: Python不允许程序员选择采用传值还是传 引用.Python参数传递采用的肯定是"传对象引用 ...

  8. Java中引用类型变量,对象,值类型,值传递,引用传递 区别与定义

    一.Java中什么叫做引用类型变量?引用:就是按内存地址查询       比如:String s = new String();这个其实是在栈内存里分配一块内存空间为s,在堆内存里new了一个Stri ...

  9. 【转载】C++ 值传递、指针传递、引用传递详解

    原文链接:http://www.cnblogs.com/yanlingyin/ 值传递: 形参是实参的拷贝,改变形参的值并不会影响外部实参的值.从被调用函数的角度来说,值传递是单向的(实参->形 ...

  10. C++中值传递、指针传递、引用传递的总结

    C++中值传递.指针传递.引用传递的总结   指针传递和引用传递一般适用于:函数内部修改参数并且希望改动影响调用者.对比值传递,指针/引用传递可以将改变由形参"传给"实参(实际上就 ...

随机推荐

  1. Hadoop三种安装模式:单机模式,伪分布式,真正分布式

    Hadoop三种安装模式:单机模式,伪分布式,真正分布式 一 单机模式standalone单 机模式是Hadoop的默认模式.当首次解压Hadoop的源码包时,Hadoop无法了解硬件安装环境,便保守 ...

  2. linux 使用串口连接设备console

    linux使用串口连接cisco设备的console   linux 自带一个串口命令:minicom,需要经过设置,之后就可以连接了.   传说是默认就可以,我可能RP不好,我必须要经过设置才可以. ...

  3. 模块已加载,但对dllregisterServer的调用失败

    在注册dll或者ocx的时候, 经常会遇到这么一个问题: 模块  已加载,但对dllregisterServer的调用失败,错误代码为0x8004***** 网上有网友回复说需要在管理员的模式下进行注 ...

  4. Hibernate,JPA注解@ManyToMany

    @ManyToMany默认处理机制,当双向多对多关联中没有定义任何物理映射时, Hibernate根据以下规则生成相应的值: 关联表名: 主表表名+_下划线+从表表名: 关联到主表的外键名:从表用于关 ...

  5. HDU 1024:Max Sum Plus Plus(DP)

    http://acm.hdu.edu.cn/showproblem.php?pid=1024 Max Sum Plus Plus Problem Description Now I think you ...

  6. javaScript数组循环删除

    遍历数组循环的时候,限定条件不要写arr.length,因为数组的长度会随着删除元素的同时减小. 例如,一个原本长度为10的数组,如果采用 for(var i = 0; i< arr.lengt ...

  7. python: linux下安装redis

    Python连接时报拒绝连接,需要重装redis: 1) 卸载redis sudo apt-get remove redis-server sudo apt-get autoremove 2)编译安装 ...

  8. 简单选择排序(Java)

    简单选择排序: 每一趟在整个记录中找到最小的那个作为有序序列的第i个记录. class SelectSort{ public void p(int[] a){ for(int i=0;i<a.l ...

  9. 转 python range 用法

    详细记录python的range()函数用法   使用python的人都知道range()函数很方便,今天再用到他的时候发现了很多以前看到过但是忘记的细节.这里记录一下range(),复习下list的 ...

  10. initComponents()方法

    initComponents()是在使用GUI工具设计GUI界面时,NetBeans系统自动生成的方法. 其功能是在界面添加各个组件,并为它们注册监听器. 把initComponents()放在构造方 ...