zoukankan      html  css  js  c++  java
  • 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是引用类型,对它所作的修改实际是对托管堆中的对象做的修改,其值未修改后的值。

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

  • 相关阅读:
    Power BI 根据用户权限动态生成导航跳转目标
    Power BI Tooltips 增强功能
    Power BI refresh error “could not load file or assembly…provided impersonation level is invalid”
    SQL 错误代码 18456
    如何使用SQL Server Integration Services从多个Excel文件读取数据
    通过表格编辑器将现有表引入Power BI数据流
    Power BI 中动态增长的柱状图
    ambari2.7.3离线安装hdp3.1.0时,ambari-hdp-1.repo中baseurl无值
    ambari 安装 cannot download file mysql-connector-java from http://8080/resource/mysql-connector-java.jar
    洛谷P4180 [BJWC2010]严格次小生成树
  • 原文地址:https://www.cnblogs.com/qixuejia/p/4413027.html
Copyright © 2011-2022 走看看