zoukankan      html  css  js  c++  java
  • C# 函数2 (传值与传址)

      1 using System;
      2 using System.Collections.Generic;
      3 using System.Linq;
      4 using System.Text;
      5 
      6 namespace ConsoleApplication1
      7 {
      8     class Program
      9     {
     10         /*   先来了解一下什么是实参, 什么是形参.   
     11               所谓形参其实也就是说函数定义的时候所带的参数.  比如 static void Myfuntion(int i , int t)  其中 int i  and int t 都是形参.
     12          *   而实参呢? 实参代表的是将要传入函数里面进行运算的两个参数, 可以是变量,也可以是常量.只要与形参类型相同即可*/
     13 
     14         // 函数分为传值与传址两种方式. 传值不影响实参的数据,传址则会影响实参的数据. 下面用几段代码来示例
     15           //在使用传值或者传址的选择上应当遵循这样一个规则.
     16             //1. 传值是将形参的内容复制一份给实参.
     17             //2. 传址是将形参与实参同时指向一个地址.
     18             //如果在数据较大的情况下使用传值的方式必然会影响程序性能, 所以当数据较大时可以使用传址的方式.使用传址的方式会让程序的效率大大提升.
     19         static void Myfuntion(int i , int t)  //这个函数将以传值的方式运行  
     20         {
     21             if (i > t)
     22                 i += 5;
     23             else
     24                 t += 5;
     25         }
     26 
     27         static void Myfuntion1(ref int i, ref int t) // 这个函数将会以传址的方式进行运算. 因为前面加了ref关键字, 函数只要加了ref关键字就会是以传址的方式进行运算
     28         {
     29             if (i > t)
     30                 i += 5;
     31             else
     32                 t += 5;
     33         }
     34 
     35         static void Myfuntion2(int[] array)  //这里注意, 这个函数没有带ref关键字, 但是也是以传址的方式进行运算. 因为在C#中,引用类型都是以传址的方式进行运算,而array属于数组, 数组又属于引用类型,所以....
     36         {
     37             for (int i = 0; i < array.Length; i++)
     38             {
     39                 array[i] = 40;
     40             }
     41         }
     42 
     43         static void Myfuntion3 (int i , int t , out int s)  //这个函数虽然返回值为Void(代表没有返回值) , 其实有返回值 因为我们加了一个新的关键字, out , 这个关键字能够将 s 单独返回. 同样out关键字也是以传址的方式进行运算的.  还有,out 参数可以不用赋值,即使你赋值了也会被忽略
     44         {
     45             s = 50;
     46             if (i > t)
     47                 i += 5;
     48             else
     49                 t += 5;
     50         }
     51 
     52         static void Main(string[] args)
     53         {
     54             // 现在我们来使用上面定义的四个函数,看看效果是怎样的.
     55             int a = 10, b = 15, c;
     56             //1. 传值方式的函数
     57             Myfuntion(a, b);  // 这个时候a and b 还是等于 10 和 15  , 因为函数中的形参虽然改变结果了. 但是不会影响到实参. 
     58             Console.WriteLine("a : {0} and b : {1}",a,b + "\n");
     59 
     60             // 2. 传址方式的函数
     61             Myfuntion1(ref a, ref b); //这里要注意, 函数中使用了ref关键字,在调用的时候也要使用ref关键字.  此时的结果应该是a = 10 b = 20 因为上面的代码是传址方式的, 形参发生了改变也会影响到实参        
     62             Console.WriteLine("a : {0} and b : {1}",a,b + "\n"); 
     63 
     64             // 3.隐式的传址方式函数. 
     65             int[] My = new int[5];  //定义一个数组并且为它赋值
     66             for (int i = 0; i < My.Length; i++)  
     67             {
     68                 My[i] = 30;
     69             }
     70             // 现在调用函数
     71             Myfuntion2(My);   //结果可想而知, my的每一位都会等于 50
     72             foreach (int w in My)
     73             {
     74                 Console.WriteLine(w);
     75                 Console.WriteLine();
     76             }
     77 
     78             // 4. out 参数函数
     79             Myfuntion3(a, b, out c); //同样, 和ref一样在调用的时候也需要加上关键字
     80             Console.WriteLine(c); // c应该会等于 50
     81             //我们试试把C赋值了之后再调用函数,看看会发生什么.
     82             c = 90;
     83             Myfuntion3(a, b, out c);
     84             Console.WriteLine(c);  //还是会等于50;
     85         }
     86     }
     87 }
     88 // 下面是运算结果 
     89 
     90 /*  a : 10 and b : 15
     91 -------------------
     92 a : 10 and b : 20
     93 ------------------
     94 40
     95 
     96 40
     97 
     98 40
     99 
    100 40
    101 
    102 40
    103 ----------------------
    104 50
    105 ----------------------
    106 50 
    107 
    108  * */
  • 相关阅读:
    javascript阻止子元素继承父元素事件
    UTC 时间转化为北京时间
    uniapp中引入less文件
    HDU 1002 A + B Problem II(大数据)
    FatMouse's Speed(dp)
    Monkey and Banana(dp)
    Piggy-Bank(dp,背包)
    Longest Ordered Subsequence(最长上升子序列,dp)
    我的第一篇博客
    redis优化方案
  • 原文地址:https://www.cnblogs.com/mdnx/p/2671060.html
Copyright © 2011-2022 走看看