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
------------------------------------
 


目录
相关文章
|
1月前
|
JSON 程序员 C#
使用 C# 比较两个对象是否相等的7个方法总结
比较对象是编程中的一项基本技能,在实际业务中经常碰到,比如在ERP系统中,企业的信息非常重要,每一次更新,都需要比较记录更新前后企业的信息,直接比较通常只能告诉我们它们是否指向同一个内存地址,那我们应该怎么办呢?分享 7 个方法给你!
|
1月前
|
C# UED SEO
C# 异步方法async / await任务超时处理
通过使用 `Task.WhenAny`和 `Task.Delay`方法,您可以在C#中有效地实现异步任务的超时处理机制。这种方法允许您在指定时间内等待任务完成,并在任务超时时采取适当的措施,如抛出异常或执行备用操作。希望本文提供的详细解释和代码示例能帮助您在实际项目中更好地处理异步任务超时问题,提升应用程序的可靠性和用户体验。
73 3
|
2月前
|
存储 C#
【C#】大批量判断文件是否存在的两种方法效率对比
【C#】大批量判断文件是否存在的两种方法效率对比
52 1
|
2月前
|
C#
C#的方法的参数传递
C#的方法的参数传递
28 0
|
7月前
|
开发框架 前端开发 .NET
C#编程与Web开发
【4月更文挑战第21天】本文探讨了C#在Web开发中的应用,包括使用ASP.NET框架、MVC模式、Web API和Entity Framework。C#作为.NET框架的主要语言,结合这些工具,能创建动态、高效的Web应用。实际案例涉及企业级应用、电子商务和社交媒体平台。尽管面临竞争和挑战,但C#在Web开发领域的前景将持续拓展。
219 3
|
7月前
|
SQL 开发框架 安全
C#编程与多线程处理
【4月更文挑战第21天】探索C#多线程处理,提升程序性能与响应性。了解C#中的Thread、Task类及Async/Await关键字,掌握线程同步与安全,实践并发计算、网络服务及UI优化。跟随未来发展趋势,利用C#打造高效应用。
210 3
|
1月前
|
C# 开发者
C# 一分钟浅谈:Code Contracts 与契约编程
【10月更文挑战第26天】本文介绍了 C# 中的 Code Contracts,这是一个强大的工具,用于通过契约编程增强代码的健壮性和可维护性。文章从基本概念入手,详细讲解了前置条件、后置条件和对象不变量的使用方法,并通过具体代码示例进行了说明。同时,文章还探讨了常见的问题和易错点,如忘记启用静态检查、过度依赖契约和性能影响,并提供了相应的解决建议。希望读者能通过本文更好地理解和应用 Code Contracts。
36 3
|
5天前
|
存储 安全 编译器
学懂C#编程:属性(Property)的概念定义及使用详解
通过深入理解和使用C#的属性,可以编写更清晰、简洁和高效的代码,为开发高质量的应用程序奠定基础。
36 12
|
1月前
|
设计模式 C# 图形学
Unity 游戏引擎 C# 编程:一分钟浅谈
本文介绍了在 Unity 游戏开发中使用 C# 的基础知识和常见问题。从 `MonoBehavior` 类的基础用法,到变量和属性的管理,再到空引用异常、资源管理和性能优化等常见问题的解决方法。文章还探讨了单例模式、事件系统和数据持久化等高级话题,旨在帮助开发者避免常见错误,提升游戏开发效率。
52 4
|
3月前
|
API C#
C# 一分钟浅谈:文件系统编程
在软件开发中,文件系统操作至关重要。本文将带你快速掌握C#中文件系统编程的基础知识,涵盖基本概念、常见问题及解决方法。文章详细介绍了`System.IO`命名空间下的关键类库,并通过示例代码展示了路径处理、异常处理、并发访问等技巧,还提供了异步API和流压缩等高级技巧,帮助你写出更健壮的代码。
53 2