c#方法中调用参数的值传递方式和引用传递方式以及ref与out的区别深入解析
发布时间:2023-04-07 03:43:25
#define Test
using System;
namespace Wrox.ProCSharp.ParameterTestSample
...{
class ParemeterTest
...{
static void TestInt(int[] ints,int i)
...{
ints[0] = 100;
i = 100;
}
static void TestInt(int[] ints, ref int i)
...{
ints[0] = 200;
i = 200;
}
static void TestInt2(int[] ints, out int i)
...{
ints[0] = 300;
i = 300;
}
public static void Main()
...{
int i=0;
int[] ints = ...{0,1,2,3,4};
Console.WriteLine("-----------TestInt------------------");
Console.WriteLine("i={0}",i);
Console.WriteLine("ints[0]={0}",ints[0]);
Console.WriteLine("------------------------------------");
//默认情况下,c#所有参数都是通过值引用的,所以值类型i在上面的函数调用时,传送的只是一个副本,函数只是在调用过程中影响了副本的值,对i值实际并没有影响
TestInt(ints, i);
Console.WriteLine("i={0}",i);//这里输出的i值仍然是0
Console.WriteLine("ints[0]={0}",ints[0]);
Console.WriteLine("------------------------------------");
//如果要改变i的值,可以用ref让参数i通过引用传送给函数
TestInt(ints, ref i);
Console.WriteLine("i={0}",i);//这里输出的i值为200
Console.WriteLine("ints[0]={0}",ints[0]);
Console.WriteLine("------------------------------------");
//要改变i的值,也可以通过out关键字让
TestInt2(ints, out i);
Console.WriteLine("i={0}", i);//这里输出的i值为300
Console.WriteLine("ints[0]={0}", ints[0]);
Console.WriteLine("------------------------------------");
//ref与out很相似,但有也区别,ref必须要求参数初始化,out则不需要
#if Test//要测试下面的二行,把代码第一行#define Test去掉注释即可
int j;
SomeFunction(ints, ref j);//编译时会报错: 使用了未赋值的局部变量“j”
#endif
int k;
TestInt2(ints, out k);
Console.WriteLine("k={0}", k);
Console.WriteLine("------------------------------------");
Console.ReadLine();
}
}
}
运行结果;
-----------TestInt------------------
i=0
ints[0]=0
------------------------------------
i=0
ints[0]=100
------------------------------------
i=200
ints[0]=200
------------------------------------
i=300
ints[0]=300
------------------------------------
k=300
------------------------------------
猜你喜欢
- 前言本文主要给大家介绍了关于Java读取二进制文件的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧。读Hex写CS
- 一、项目简述环境配置:Jdk1.8 + Tomcat8.5 + mysql + Eclispe(IntelliJ IDEA,Eclispe,
- 今天一个读者问我关于Android通过调用Webservice实现天气预报这篇文章的源码下载后出现的错误Could not find cla
- Java流程控制用户交互Scannerjava.util.Scanner是Java5的新特征,可以通过Scanner类来获取用户的输入基本语
- 基础环境SpringBoot、Maven代码实现1.添加依赖<!--二维码生成 --><dependency&
- 本博文参考自https://www.jb51.net/article/100269.htmwww.jb51.net/article/1002
- Java源码系列三-工具类Arrays今天分享java的源码的第三弹,Arrays这个工具类的源码。因为近期在复习数据结构,了解到Array
- 废话不多说了,直接给大家贴代码了,具体代码如下所示:html代码如下:<body><input id="file
- 布局:<?xml version="1.0" encoding="utf-8"?><
- java.util.concurrent包中的工具实现核心都是AQS,了解ReentrantLock的实现原理,需要先分析AQS以及AQS与
- 一、介绍在实际的软件项目开发过程中,我可以很负责任的跟大家说,如果你真的实际写代码的时间超过5年,你对增删改查这类简单的功能需求开发,可以说
- Maven是项目对象模型(POM),可以通过一小段描述信息来管理项目的构建,报告和文档的项目管理工具软件。Maven是一个项目管理工具,它包
- package list;import java.util.ArrayList;/** * Java约瑟夫问题: n个人(不同id
- SpringBoot对actuator进行关闭management: endpoint: health
- 在进行Android系统开发的时候,有些特定的情况需要设置系统永不锁屏,永不休眠。本篇文章给大家介绍Android 永不锁屏,开机不锁屏,删
- 实现效果如下:实现思路:1、如何实现圆中水面上涨效果:利用Paint的setXfermode属性为PorterDuff.Mode.SRC_I
- 简介最近几年,各种新的高效序列化方式层出不穷,不断刷新序列化性能的上限,最典型的包括:专门针对Java语言的:Kryo,FST等等跨语言的:
- 缘由首先说明一下为什么会有这篇文章。前段时间,插件化以及热修复的技术很热,Nuwa热修复的工具NuwaGradle,携程动态加载技术Dyna
- Springboot导出文件,前端下载文件后端代码可以把请求设置为post,我这里是Get @RequestMapping(value =
- 本文实例为大家分享了RxJava Retrofit实现购物车展示的具体代码,供大家参考,具体内容如下先给大家展示一下效果图框架结构: 1.项