C#形参,实参,值传递参数,引用传递参数,输出参数,参数数组的学习
2015-04-10 00:09
651 查看
1)形参
形参顾名思义就是形式上的参数,不是实际的参数,它代替实际传入方法的值。在方法体代码中代表了值本身参与运算。形参定义于参数中,它不同于方法体内局部变量,因为是一个变量,在它的作用域内不允许存在一个同名的局部变量,不管他们的类型是否相同,都是不允许出现同名的。
看下面的代码示例:
形参的特点:
①形参是一个变量,它具有变量的全部特点。②方法的形参可以有多个,形参直接使用逗号进行隔开,即使类型相同的多个参数也不可以合并声明。
2)实参
实参是相对于形参而言的,形参是实际值的“替身”,这个替身所代表的实际值即为实参。实际值可以是一个具体的值,也可以是一个变量
看下面的代码示例:
①实参用于初始化形参的实际值或者表达式②实参位于要调用的方法参数列表中。
3)按值传递参数
值参数是通过将实参的值复制到形参。来实现将值传递到方法,也就是所谓的按值传递,当方法被调用是,CLR做如下操作:
①在托管栈堆中为形参分配空间 ②将实参的值复制到形参
其中,在值参数中,实参也可以是任何计算结果满足类型要求的表达式,不一定是变量。
看下面的代码示例:
下面看一段代码,分别观察形参,实参在托管堆和托管栈中的分配和使用情况
①在方法被调用前:系统在栈中为Rectangle类的实例rectange和值类型myValue分配空间,其中引用类型rectange指向堆中的Rectangle对象实例,myValue是值类型,因此其值位于托管栈中。演示图如下
②方法调用开始时:实参将值复制到CalculateArea的形参,其中rectange为引用类型,因为复制一个新的引用——rect,此刻这两个引用都指向同一个对象,myValue是值类型,因此可以直接复制其值——value。演示图如下:
③方法调用过程中,改变引用所指向对象的length字段和width字段,以及value值自增1
④方法调用以后,形参rect和value被从栈中弹出。myValue是值类型,他的值并没有改变(改变的是形参value);rectange是引用类型,对它所作的修改实际是对托管堆中的对象做的修改,其值未修改后的值。
要明白值传递参数,主要明白值类型和引用类型在托管栈和托管堆中的作用状态。这样理解起来就非常的容易。
形参顾名思义就是形式上的参数,不是实际的参数,它代替实际传入方法的值。在方法体代码中代表了值本身参与运算。形参定义于参数中,它不同于方法体内局部变量,因为是一个变量,在它的作用域内不允许存在一个同名的局部变量,不管他们的类型是否相同,都是不允许出现同名的。
看下面的代码示例:
//这其中的strName就是一个形参也是一个变量,不允许出现同名的局部变量 public void SayHelloTo(string strName) { Console.WriteLine("我的名字是{0}", strName); }
形参的特点:
①形参是一个变量,它具有变量的全部特点。②方法的形参可以有多个,形参直接使用逗号进行隔开,即使类型相同的多个参数也不可以合并声明。
2)实参
实参是相对于形参而言的,形参是实际值的“替身”,这个替身所代表的实际值即为实参。实际值可以是一个具体的值,也可以是一个变量
看下面的代码示例:
static void Main(string[] args) { Program pro = new Program(); int nNum = 10; //当调用Add方法时,传进去两个参数,第一个是实际的值, //第二个nNum是变量,但是在传入方法时已经初始化 int nResult = pro.Add(20, 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 = 10; int w = 20; //在这里i * 2和(w+10)/10充当了实参的角色 int nResult = pro.Add(i * 2, (w + 10) / 10); 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 = 10; //这里的rectange,myValue是实参 pro.CalculateArea(rectange, myValue);//调用方法 } //这里的(Rectangle rect,int value)是形参 public void CalculateArea(Rectangle rect,int value) { rect.Length += 10; rect.width += 15; rect.Area = rect.Length * rect.width; value++; } } //一个矩形类 public class Rectangle { public int Length = 10; public int width = 15; public int Area; }
①在方法被调用前:系统在栈中为Rectangle类的实例rectange和值类型myValue分配空间,其中引用类型rectange指向堆中的Rectangle对象实例,myValue是值类型,因此其值位于托管栈中。演示图如下
②方法调用开始时:实参将值复制到CalculateArea的形参,其中rectange为引用类型,因为复制一个新的引用——rect,此刻这两个引用都指向同一个对象,myValue是值类型,因此可以直接复制其值——value。演示图如下:
③方法调用过程中,改变引用所指向对象的length字段和width字段,以及value值自增1
④方法调用以后,形参rect和value被从栈中弹出。myValue是值类型,他的值并没有改变(改变的是形参value);rectange是引用类型,对它所作的修改实际是对托管堆中的对象做的修改,其值未修改后的值。
要明白值传递参数,主要明白值类型和引用类型在托管栈和托管堆中的作用状态。这样理解起来就非常的容易。
相关文章推荐
- C#形参,实参,值传递参数,引用传递参数,输出参数,参数数组的学习
- C#形参,实参,值传递参数,引用传递参数,输出参数,参数数组的学习(一) 分类: C# 2012-11-01 22:12 620人阅读 评论(0) 收藏
- C#形参,实参,值传递参数,引用传递参数,输出参数,参数数组的学习(一)
- C#形参,实参,值传递参数,引用传递参数,输出参数,参数数组的学习(一)
- C#形参,实参,值传递参数,引用传递参数,输出参数,参数数组的学习(一)
- C#形参,实参,值传递参数,引用传递参数,输出参数,参数数组的学习(一)
- C#形参,实参,值传递参数,引用传递参数,输出参数,参数数组的学习(一)
- C#基础学习--方法参数的种类,值参数,引用参数(ref),输出参数(out),数组参数(params)
- c# .net 调用SQL SERVER存储过程 形参 "@**" 未声明为 OUTPUT 参数,但传递进来的实参请求输出。
- 按值、按引用和作为输出变量传递数组参数
- c#学习2——值参数、引用参数、输出参数
- C++ primer 传递参数( const 实参 形参 引用)
- C#:ref(引用传递参数)和out(输出参数))
- C#调用c++的dll,结构体数组作为引用参数的传递方式
- 用引用&传递参数!指针型常量!形参和实参!SP & WP
- C#参数的传递:值传递、引用传递、输出参数
- C#学习基本概念之传递引用类型参数(二)
- C#方法的六种参数,值参数、引用参数、输出参数、参数数组、命名参数、可选参数
- 数据库异常 形参 @strCompellation 未声明为 OUTPUT 参数 但传递进来的实参请求输出
- C#中参数数组、引用参数和输出参数示例详解