c#方法中调用参数的值传递方式和引用传递方式,以及ref与out的区别

简介: //#define Testusing System;namespace Wrox.ProCSharp.ParameterTestSample...{ class ParemeterTest ..
// #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
------------------------------------
 


目录
相关文章
|
3小时前
|
程序员 C#
C#抽象类和抽象方法详解
C#抽象类和抽象方法详解
9 0
|
3小时前
|
C#
c#一文读懂continue、return、break区别
c#一文读懂continue、return、break区别
9 0
|
3小时前
|
存储 开发框架 .NET
C#中将DataTable转化成ListT的方法解析
C#中将DataTable转化成ListT的方法解析
8 0
|
3小时前
|
数据采集 前端开发 数据挖掘
Fizzler库+C#:从微博抓取热点的最简单方法
本文介绍如何使用Fizzler库和C#构建微博热点信息爬虫。通过Fizzler的CSS选择器定位关键信息,提取热点标题和排名,实现微博内容的智能挖掘。示例代码展示单线程和多线程采集方法,并涉及代理IP使用。
Fizzler库+C#:从微博抓取热点的最简单方法
|
3小时前
|
存储 数据采集 API
C# GetField 方法应用实例
C# GetField 方法应用实例
|
3小时前
|
JSON 安全 API
C# GetMethod 方法应用实例
C# GetMethod 方法应用实例
|
3小时前
|
设计模式 IDE 测试技术
提升 C#编程效率的技巧与方法
【4月更文挑战第20天】提升C#编程效率的关键技巧包括:选择合适的IDE(如Visual Studio)、掌握基础语法、规划良好代码结构、使用代码生成工具、复用代码、利用库和框架、定期重构、应用设计模式、避免过度设计、进行代码审查、自动化测试、学习新技术、养成良好编程习惯、定期备份代码及参与技术社区。通过这些方法,开发者能提高代码质量和开发效率。
|
3小时前
|
开发框架 前端开发 .NET
C#编程与Web开发
【4月更文挑战第21天】本文探讨了C#在Web开发中的应用,包括使用ASP.NET框架、MVC模式、Web API和Entity Framework。C#作为.NET框架的主要语言,结合这些工具,能创建动态、高效的Web应用。实际案例涉及企业级应用、电子商务和社交媒体平台。尽管面临竞争和挑战,但C#在Web开发领域的前景将持续拓展。
|
3小时前
|
SQL 开发框架 安全
C#编程与多线程处理
【4月更文挑战第21天】探索C#多线程处理,提升程序性能与响应性。了解C#中的Thread、Task类及Async/Await关键字,掌握线程同步与安全,实践并发计算、网络服务及UI优化。跟随未来发展趋势,利用C#打造高效应用。
|
3小时前
|
存储 安全 网络安全
C#编程的安全性与加密技术
【4月更文挑战第21天】C#在.NET框架支持下,以其面向对象和高级特性成为安全软件开发的利器。本文探讨C#在安全加密领域的应用,包括使用System.Security.Cryptography库实现加密算法,利用SSL/TLS保障网络传输安全,进行身份验证,并强调编写安全代码的重要性。实际案例涵盖在线支付、企业应用和文件加密,展示了C#在应对安全挑战的同时,不断拓展其在该领域的潜力和未来前景。