最近在从事两年前学过的C#语言工作,对于第三门接触的编程语言(第一门当然是是C语言、第二门是汇编),好多知识随时间的流过都变得不是那么熟练,刚好趁此机会学习巩固基础,厚积薄发。在此记下笔记也是想C#入门的同学参考,怎样在.NET的道路上更上一层楼。

首先就从简单的非基础的基础开始(一定要有语言的基本功底,比如:变量、函数、运算符、类、对象等等)。

我们先来做一个例子:交换两个数字的值。看一下代码:

   1:   public void Swap(int a, int b)
   2:          {
   3:              Console.WriteLine("交换前的两个值分别是:a={0},b={1}",a,b);
   4:              int temp;
   5:              temp = a;
   6:              a=b;
   7:              b = temp;
   8:              Console.WriteLine("交换后的两个值分别是:a={0},b={1}",a,b);
   9:          }

这是典型的按照值类型的交换,在交换过程前加入有两个数字num1=1、num2=2,调用此函数在函数内部实现交换绝对是没有问题的,也可以实现交换的输出。但是外部的num1,num2真的实现了交换吗?我们来分析一下,如果我来调用Swap(num1,num2),两个实参传入方法,形参a、b接受参数,对应的a=1,b=2,在函数内部交换的值只是形参(实参的数值的一个复制,不会对实参产生影响),所以再出的交换对num1,num2不会产生影响。一句话,这就是按值传递!按值传递只能将数据带入构造函数,不能带出构造函数,因此num1,num2不会发生变化。

那么怎样实现真正的交换数值呢?答曰:引用传递!按引用传递时将数值的地址传递过去,同时执行一个地址,一次修改一个,另一个也会发生变化!在C#中我们通常借用ref,out实现这类情况!

例如代码:

   1:  static void Main(string[] args)
   2:          {
   3:              int num1 = 1;
   4:              int num2 = 2;
   5:              Console.WriteLine("a={0},b={1}",num1,num2);
   6:              Swap(ref num1,ref num2);
   7:              Console.WriteLine("a={0},b={1}", num1, num2);
   8:   
   9:          }
  10:          public static void Swap( ref int a,ref int b)
  11:          {
  12:              int temp;
  13:              temp = a;
  14:              a = b;
  15:              b = temp;
  16:          }
 
这样就会交换成功!

为什么会这样呢?ref的作用是什么呢?ref 关键字使参数按引用传递。 其效果是,当控制权传递回调用方法时,在方法中对参数的任何更改都将反映在该变量中。通俗的讲按引用传递时既可以将参数带入方法,亦可以将参数值带出方法。对同一个地址的数值修改肯定会影响变量的值,因此改变,交换成功!

注意:

请不要将“通过引用传递”概念与“引用类型”概念相混淆。这两个概念不相关;方法参数无论是值类型还是引用类型,都可通过 ref 进行修饰。 因此,通过引用传递值类型时没有值类型装箱。

那么什么是Out呢?请看这个例子:

   1:  class Class1
   2:  {
   3:      static void Method(out int i)
   4:      {
   5:          i = 44;
   6:      }
   7:      static void Main()
   8:      {
   9:          int value;
  10:          Method(out value);
  11:          // value=44
  12:      }
  13:  }

尽管作为 out 参数传递的变量不必在传递之前进行初始化,但被调用的方法需要在返回之前赋一个值。

尽管 ref 和 out 关键字会导致不同的运行时行为,但在编译时并不会将它们视为方法签名的一部分。 因此,如果两个方法唯一的区别是:一个接受 ref 参数,另一个接受 out 参数,则无法重载这两个方法。

传值传递引用的主要区别实质是对地址的使用,按引用传递是赋值一个副本,而按引用传递时则是对地址的传递,直接修改原始。

那么对引用类型量传递时间会涉及此类问题吗?我认为是不会的,下面我们会通过一个例子来演示这个结论。首先我先说出这个结论:引用类型的变量传递是按引用传递的,直接对地址操作!(数组类型是引用类型),下面我们来操作一个数组:

   1:   static void FillArray(ref int[] arr)
   2:          {
   3:              if (arr==null)
   4:              {
   5:                  arr = new int[10];
   6:              }
   7:              arr[0] = 1111;
   8:              arr[2] = 2345;
   9:          }
  10:          static void Main(string[] args)
  11:          {
  12:              int[] arr = new int[10] { 1,2,3,4,5,6,7,8,9,0};
  13:              FillArray(ref arr);
  14:              string s = "";
  15:              foreach (var a in arr)
  16:              {
  17:                  s+= a+"\t";
  18:              }
  19:              Console.WriteLine(s);
  20:          }

输出结果是已经修改过的数组:

1111    2       2345    4       5       6       7       8       9       0

下面我们直接不适用ref来传递数组:

   1:  //注意不适用ref关键字 
   2:  static void FillArray( int[] arr)
   3:          {
   4:              if (arr==null)
   5:              {
   6:                  arr = new int[10];
   7:              }
   8:              arr[0] = 1111;
   9:              arr[2] = 2345;
  10:          }
  11:          static void Main(string[] args)
  12:          {
  13:              int[] arr = new int[10] { 1,2,3,4,5,6,7,8,9,0};
  14:              FillArray( arr);
  15:              string s = "";
  16:              foreach (var a in arr)
  17:              {
  18:                  s+= a+"\t";
  19:              }
  20:              Console.WriteLine(s);
  21:          }

得到的结果依旧是:

1111       2       2345       4       5        6      7        8         9        0

(【数组是按引用传递的,所以用不用ref是一样的..                         】)这样子理解是错误的,稍后会解释这是为什么。关于值类型,引用类型,按值传递,按引用传递是怎么运行的,有什么关系 后文给出明确的解释,在此记录作为学习记录。

转载于:https://www.cnblogs.com/sunBolg/archive/2012/04/30/2477273.html

C#阶段提高之---交换数值相关推荐

  1. 黑马程序员C++ 第三阶段 提高篇(1)

    C++提高编程 本阶段主要针对C++泛型编程和STL技术做详细讲解,探讨C++更深层的使用 一.模板 1.1 模板的概念 模板就是建立通用的模具,大大提高复用性 模板的特点: 模板不可以直接使用,它只 ...

  2. Python中的四种交换数值的方法

    交换两个变量的值方法,这个面试题如果只写一种当然很简单,没什么可以说的. 今天这个面试是问大家有几种办法来实现交换两个变量的值. 在没开始看具体答案前,你可以先想想看 下面分别来说说这几种方法 方法一 ...

  3. c语言 swap交换函数_重审C中老生常谈的swap函数交换数值

    概览 本文内容是关于C语言参数传值,以及x86底层实现的计算机科学. 包含了原理速览以及代码示例. 引言 如果你学习过C,可能会对经典的swap函数问题记忆深刻.简单的参数传值并不能在函数外部完成两个 ...

  4. 信息学奥赛C++语言:交换数值

    [题目描述] 从键盘输入整数A,B的值,然后把A,B的值交换后输出 [输入] 输入一行,包含2 个整数 [输出] 输出2个整数,中间用一个空格隔开 [输入样例] 3 4 [输出样例] 4 3 代码 # ...

  5. C++的三种交换数值的方式(值传递、地址传递、引用传递)

    #include <iostream>using namespace std;//值交换void swap1(int a, int b) {int temp = a;a = b;b = t ...

  6. 使用指针在函数中交换数值

    #include<stdio.h>void swap(int* a,int *b) {/*int temp = *a;*a = * b;*b = temp;*/*a += *b;*b = ...

  7. python四种数值交换方法

    两个整数变量 a = 5, b = 100,交换数值 [解法一:使用其他变量] c = a a = b b = a print(a, b) [解法二:不使用临时变量] ''' 遇到问题没人解答?小编创 ...

  8. C语言位操作--不用中间变量交换两数值

    1.使用加法与减法交换两数值: #define SWAP(a, b) ((&(a) == &(b)) || \(((a) -= (b)), ((b) += (a)), ((a) = ( ...

  9. C语言 数值交换的三种方法

    一.编程思想 通过建立第三个变量来交换数值: 不建立变量,通过加减的方式交换(PS:如果俩个数值过大,则可能会溢出) 不建立变量,通过异或操作符交换(最高效简洁,不会溢出,是1.2的升级) 异或交换 ...

  10. 游戏数值策划入门介绍

    网上有很多关于数值策划入门的文章了,也有很多精品,但是却鲜有提及如何认识数值策划这个岗位,我说的是思想上.这正如一本书介绍Excel,一味的介绍函数.VBA,操作技巧快捷键,却不告诉你应当如何看待函数 ...

最新文章

  1. 前端开发学习Day27
  2. Centos系统上安装php遇到的错误解决方法集锦
  3. Magicodes.WeiChat——自定义knockoutjs template、component实现微信自定义菜单
  4. RL之DQN:基于TF训练DQN模型玩“打砖块”游戏
  5. java 查找排序_Java类库中的一些常用的查找排序
  6. df -l查看本地文件系统
  7. itextpdf添加表格元素_java使用iText生成pdf表格详解
  8. android开源数据库,Android Hawk数据库 github开源项目
  9. cent os7 安装jenkins(rpm)
  10. 【华为HCIE安全考什么科目?华为HCIE安全考什么知识点?】
  11. VirtualBox 端口转发(端口映射) 主机和虚拟机相互访问
  12. php beanstalk 客户端,Pheanstalk(beanstalk的PHP客户端)-连接如何工作?
  13. Mybatis报错: Could not find resource mapper
  14. 软考高项记忆小妙招-项目章程
  15. 疲劳检测,基于视频的疲劳检测、脱岗、打呵欠、闭眼、点头等检测
  16. ubuntu 16.04 14.04 安装各种软件
  17. python全套教程百度云-老男孩python全套视频教程百度云资源下载
  18. HTML - CSS - JavaScript
  19. 出圈问题(java)-----n个人围成一圈,数到key或者key的倍数,出圈,问剩下的最后一个人原来的位置是多少?
  20. Raydium被盗造成巨额损失,但Zebec Protocol以及$ZBC并未受影响

热门文章

  1. mysql数据库管理工具navicat for mysql怎么用
  2. 运行出现 Multiple dex files define Landroid/support/annotation/AnimRes 解决方法
  3. varchar(10)与nvarchar(10)有什么区别
  4. Installation openQRM
  5. phpMyAdmin安装配置方法全过程,及问题解决
  6. TCP网络通讯如何解决分包粘包问题
  7. php位置,php – 如何有效地找到一个给定位置附近最近的位置
  8. mysql5.6.38 设置密码_Percona Server MySQL 5.6.38修改root密码(忘记root密码)
  9. Luogu1005 矩阵取数游戏
  10. 多层陶瓷电容器用处_具有综合优异电卡性能的无铅多层陶瓷电容器研究新进展...