文档章节

C#在代码中演示值传递和引用传递的含义,区别

murongqingsi
 murongqingsi
发布于 2015/09/14 21:20
字数 869
阅读 18
收藏 0
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace _02值传递与引用传递
{
    class Program
    {

        static void Main()
        {
            Console.WriteLine("*****传递分四种情况:1、分别是值传递值类型,2、引用传递值类型,3、值传递引用类型,4、引用传递引用类型");
            Console.WriteLine("***************");
            Console.WriteLine("1、值传递值类型,");
            int n = 5;
            Console.WriteLine("调用值传递值前的n值: {0}", n);

            ZhiChuanzhi(n);
            Console.WriteLine("调用值传递值之后n值发生改变: {0}", n);
            Console.WriteLine("变量 n 为值类型,包含其数据(值为 5)。当调用 ZhiChuanzhi 时,n 的内容被复制到参数 x 中,在方法内将该参数求平方。但在 Main 中,n 的值在调用 ZhiChuanzhi 方法前后是相同的。实际上,方法内发生的更改只影响局部变量 x。");
            Console.WriteLine("***************");
            Console.WriteLine("2、引用传递值类型,");
            YinyChuanzhi(ref n);
            System.Console.WriteLine("调用引用传递值之后n值发生改变: {0}", n);
            Console.WriteLine("本示例中,传递的不是 n 的值,而是对 n 的引用。参数 x 不是 int 类型,它是对 int n 的引用。因此,当在方法内对 x 求平方时,实际被求平方的是 x 所引用的项:n。");

            Console.WriteLine("***************");
            Console.WriteLine("3、值传递引用类型,");
            int[] arr = { 1, 4, 5 };
            Console.WriteLine("在 Main 内, 调用该方法的前第一个元素是: {0}", arr[0]);

            Change(arr);
            Console.WriteLine("在 Main 内, 调用该方法后的第一个元素是: {0}", arr[0]);
            Console.WriteLine("在上个示例中,数组 arr 为引用类型,在未使用 ref 参数的情况下传递给方法。在此情况下,将向方法传递指向 arr 的引用的一个副本。输出显示方法有可能更改数组元素的内容,在这种情况下,从 1改为 888。但是,在 Change 方法内使用 new 运算符来分配新的内存部分,将使变量 pArray 引用新的数组。因此,这之后的任何更改都不会影响原始数组 arr(它是在 Main 内创建的)。实际上,本示例中创建了两个数组,一个在 Main 内,一个在 Change 方法内。");

            Console.WriteLine("***************");
            Console.WriteLine("4、引用传递引用类型");
            int[] arra = { 1, 4, 5 };
            System.Console.WriteLine("在 Main 内, 调用该方法的之前第一个元素是: {0}", arr[0]);

            Changeto(ref arra);
            System.Console.WriteLine("在 Main 内, 调用该方法的之后第一个元素是: {0}", arr[0]);
            Console.WriteLine("方法内发生的所有更改都影响 Main 中的原始数组。实际上,使用 new 运算符对原始数组进行了重新分配。因此,调用 Change 方法后,对 arr 的任何引用都将指向 Changeto 方法中创建的五个元素的数组。");


            Console.ReadKey();
        }

        // 该参数的值是通过值传递的。
        // 更改不会影响x的原始值
        static void ZhiChuanzhi(int x)
        
        {
            x *= x;
            Console.WriteLine("在值传递传值方法的内部X进行自乘的结果: {0}", x);
        }

        // 该参数的值是通过引用传递值的。
        // 更改不会影响x的原始值
        static void YinyChuanzhi(ref int x)
        
        {
            x *= x;
            Console.WriteLine("在引用传递传值方法的内部X进行自乘的结果: {0}", x);
        }
        //值传递引用类型
        static void Change(int[] pArray)
        {
            pArray[0] = 888;  // 此项更改会影响原始值
            pArray = new int[5] { -3, -1, -2, -3, -4 };   // 这个更改是局部的.
            Console.WriteLine("在方法内部的第一个元素是: {0}", pArray[0]);
        }
        static void Changeto(ref int[] pArray)
        {
            // Both of the following changes will affect the original variables:
            pArray[0] = 888;
            pArray = new int[5] { -3, -1, -2, -3, -4 };
            System.Console.WriteLine("Inside the method, the first element is: {0}", pArray[0]);
        }
    }
}


© 著作权归作者所有

murongqingsi
粉丝 0
博文 9
码字总数 7395
作品 0
青岛
程序员
私信 提问
java中值传递的理解,C++中传值传递、引用传递和指针方式的理解

通过对参考文献中两篇文章的理解消化,自己运行测试分析总结如下: java的值传递理解: 代码1: public class Test { /** * @param args */ public static void main(String[] args) { Stri...

Nob
2014/09/20
1K
1
JAVA值传递or引用传递

经常会有学员讨论JAVA语言究竟是值传递还是引用传递的问题。这里我想对这个问题阐述一下我个人的观点。很多关于JAVA参数传递方式的论述都会去对比参照C/C++或C#,故而我也会对C/C++或C#的参数...

海同网校
2015/04/20
95
0
浅谈 .NET 中的对象引用、非托管指针和托管指针

目录 前言 一、对象引用 二、值传递和引用传递 三、初识托管指针和非托管指针 四、非托管指针 五、托管指针 前言 本文主要是以 C# 为例介绍 .NET 中的三种指针类型(本文不包含对于函数指针的...

黑洞视界
02/09
0
0
Java的引用传递与C#的引用传递的区别

首先看,下面的例子: class Person{ int age; String name; Person(String name,int age) { this.age = age; this.name = name; } } public class Test { public static void change(Person......

milanlover_xa
2013/06/20
0
0
out 参数修饰符(C# 参考)

Visual Studio 2013 其他版本 out 关键字会导致参数通过引用来传递。 这与 ref 关键字类似,不同之处在于 ref 要求变量必须在传递之前进行初始化。 若要使用 out 参数,方法定义和调用方法都...

石磐
2015/04/22
0
0

没有更多内容

加载失败,请刷新页面

加载更多

OSChina 周六乱弹 —— 早上儿子问我他是怎么来的

Osc乱弹歌单(2019)请戳(这里) 【今日歌曲】 @凉小生 :#今日歌曲推荐# 少点戾气,愿你和这个世界温柔以待。中岛美嘉的单曲《僕が死のうと思ったのは (曾经我也想过一了百了)》 《僕が死の...

小小编辑
今天
2.1K
14
Excption与Error包结构,OOM 你遇到过哪些情况,SOF 你遇到过哪些情况

Throwable 是 Java 中所有错误与异常的超类,Throwable 包含两个子类,Error 与 Exception 。用于指示发生了异常情况。 Java 抛出的 Throwable 可以分成三种类型。 被检查异常(checked Exc...

Garphy
今天
38
0
计算机实现原理专题--二进制减法器(二)

在计算机实现原理专题--二进制减法器(一)中说明了基本原理,现准备说明如何来实现。 首先第一步255-b运算相当于对b进行按位取反,因此可将8个非门组成如下图的形式: 由于每次做减法时,我...

FAT_mt
昨天
40
0
好程序员大数据学习路线分享函数+map映射+元祖

好程序员大数据学习路线分享函数+map映射+元祖,大数据各个平台上的语言实现 hadoop 由java实现,2003年至今,三大块:数据处理,数据存储,数据计算 存储: hbase --> 数据成表 处理: hive --> 数...

好程序员官方
昨天
61
0
tabel 中含有复选框的列 数据理解

1、el-ui中实现某一列为复选框 实现多选非常简单: 手动添加一个el-table-column,设type属性为selction即可; 2、@selection-change事件:选项发生勾选状态变化时触发该事件 <el-table @sel...

everthing
昨天
20
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部