C#形参,实参,值传递参数,引用传递参数,输出参数,参数数组的学习(一)

简介:

 1)形参

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

看下面的代码示例:

 

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

形参的特点:

 

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

2)实参

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

看下面的代码示例: 

 

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

 

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

3)按值传递参数

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

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

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

看下面的代码示例:

 

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

 

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

 

 
  1. class Program 
  2.     { 
  3.         static void Main(string[] args) 
  4.         { 
  5.             Program pro = new Program(); 
  6.             Rectangle rectange = new Rectangle(); 
  7.             int myValue = 10; 
  8.  
  9.             //这里的rectange,myValue是实参 
  10.             pro.CalculateArea(rectange, myValue);//调用方法 
  11.         } 
  12.  
  13.         //这里的(Rectangle rect,int value)是形参 
  14.         public void CalculateArea(Rectangle rect,int value) 
  15.         { 
  16.             rect.Length += 10; 
  17.             rect.width += 15; 
  18.             rect.Area = rect.Length * rect.width; 
  19.             value++; 
  20.         } 
  21.     } 
  22.  
  23.     //一个矩形类 
  24.     public class Rectangle 
  25.     { 
  26.         public int Length = 10; 
  27.         public int width = 15; 
  28.         public int Area; 
  29.     } 

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

 

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

 

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

 

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

 

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

 

 


     本文转自yisuowushinian 51CTO博客,原文链接:http://blog.51cto.com/yisuowushinian/1047296,如需转载请自行联系原作者






相关文章
|
1月前
|
Java 调度 C#
C#学习系列相关之多线程(一)----常用多线程方法总结
C#学习系列相关之多线程(一)----常用多线程方法总结
|
1月前
|
C#
C#学习相关系列之数据类型类的三大特性(二)
C#学习相关系列之数据类型类的三大特性(二)
|
1月前
|
C#
C#学习相关系列之yield和return的区别
C#学习相关系列之yield和return的区别
|
1月前
|
C#
C#学习相关系列之数组---常用方法使用(二)
C#学习相关系列之数组---常用方法使用(二)
|
1月前
|
存储 C#
C#学习系列相关之数组(一)---数组的定义与使用
C#学习系列相关之数组(一)---数组的定义与使用
|
1月前
|
C#
C#学习相关系列之常用符号介绍
C#学习相关系列之常用符号介绍
|
1月前
|
安全 编译器 C#
C#学习相关系列之多线程---lock线程锁的用法
C#学习相关系列之多线程---lock线程锁的用法
|
1月前
|
C#
C#学习相关系列之多线程---ConfigureAwait的用法
C#学习相关系列之多线程---ConfigureAwait的用法
|
1月前
|
C#
C#学习相关系列之多线程---TaskCompletionSource用法(八)
C#学习相关系列之多线程---TaskCompletionSource用法(八)
|
1月前
|
开发框架 .NET C#
C#学习相关系列之Linq用法---where和select用法(二)
C#学习相关系列之Linq用法---where和select用法(二)