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

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

  • 相关阅读:
    eclipse恢复界面默认设置
    文件夹的拷贝
    文件的输入输出
    十进制转二进制,八进制,十六进制(查表法)
    数组元素的查找(折半查找)
    C++几个小函数
    C++ 内部排序(一)
    C++实现链表
    C++输出IP地址段内的合法地址
    我看软件工程师的职业规划
  • 原文地址:https://www.cnblogs.com/yisuowushinian/p/2750401.html
Copyright © 2011-2022 走看看