C#关于ref与out的总结

简介: 原文:C#关于ref与out的总结   首先大概说下函数调用的过程,首先为被调用函数分配存储空间(分为代码区和变量区)之后将调用函数传递过来的变量压栈,然后逐一弹栈进行处理,之后进行运算,将需要返回的变量压栈,然后释放存储空间,返回调用函数,继续执行下面的代码。
原文: C#关于ref与out的总结

  首先大概说下函数调用的过程,首先为被调用函数分配存储空间(分为代码区和变量区)之后将调用函数传递过来的变量压栈,然后逐一弹栈进行处理,之后进行运算,将需要返回的变量压栈,然后释放存储空间,返回调用函数,继续执行下面的代码。

  所以在这里就有一个问题,如果我们想要把在被函数中对参数值的修改传回给调用函数怎么办(除了我们可以用return返回一个执行结果)。

  在c语言中提供了指针变量,我们可以灵活的运用指针型变量进行参数地址的互相传递,并实现了对同一存储空间的变量的操作。这样当调用函数的时候,在被调用函数中对参数的修改就会直接操作调用函数变量的存储空间,这样就得到了保存。

  在c++中取缔了指针变量,因为它是类型不安全的,容易引起系统的崩溃。取而代之的是引用,所谓引用就是当我们调用函数的时候,编译器会将调用函数的变量名重命名为调用函数的变量名,这样我们在被调用函数中对变量的操作,就是直接对调用函数的变量操作,这样就得到了保存。

  在C#中同样使用了引用。今天特别记录下C#中提供了两个,一个是ref,还有一个是out。这两个引用是有区别的,按照C#中的说法:ref叫做引用参数,要传递值并原地修改它(也就是在相同的内存位置),用引用参数就很方便。因为传递了一个变量给该方法(不仅仅是它的值),这里调用被调用函数的时候变量必须被初始化。

out叫做输出参数,传递参数可以把它设作一个输出参数。一个输出参数仅用于从方法传递回一个结果。它和引用参数的另一个区别在于:调用者不必先初始化变量才调用方法。(我的理解这里其实就是实现多个return,返回多个运行结果)

 

e.g:

1> 在此例中,在调用方(Main 方法)中声明数组 theArray,并在 FillArray 方法中初始化此数组。然后将数组元素返回调用方并显示。

class TestOut
{
   static void FillArray(out int[] arr)
    {
       // Initialize the array:
        arr = new int[5] { 1, 2, 3, 4, 5 };
    }

   static void Main()
    {
       int[] theArray; // Initialization is not required

       // Pass the array to the callee using out:
        FillArray(out theArray);

       // Display the array elements:
        System.Console.WriteLine("Array elements are:");
       for (int i = 0; i < theArray.Length; i++)
        {
            System.Console.Write(theArray[i] + " ");
        }

       // Keep the console window open in debug mode.
        System.Console.WriteLine("Press any key to exit.");
        System.Console.ReadKey();
    }
}
   

 

2> 在此例中,在调用方(Main 方法)中初始化数组 theArray,并通过使用 ref 参数将其传递给 FillArray 方法。FillArray 方法中更新某些数组元素。然后将数组元素返回调用方并显示。
class TestRef
{
   static void FillArray(ref int[] arr)
    {
       // Create the array on demand:
       if (arr == null)
        {
            arr = new int[10];
        }
       // Fill the array:
        arr[0] = 1111;
        arr[4] = 5555;
    }

   static void Main()
    {
       // Initialize the array:
       int[] theArray = { 1, 2, 3, 4, 5 };

       // Pass the array using ref:
        FillArray(ref theArray);

       // Display the updated array:
        System.Console.WriteLine("Array elements are:");
       for (int i = 0; i < theArray.Length; i++)
        {
            System.Console.Write(theArray[i] + " ");
        }

       // Keep the console window open in debug mode.
        System.Console.WriteLine("Press any key to exit.");
        System.Console.ReadKey();
    }
}
   

特此记录,感谢论坛上的帖子及相关文章。

目录
相关文章
|
2月前
|
C#
C#系列之ref和out的区别
C#系列之ref和out的区别
|
9月前
|
存储 C# C++
从C++角度讲解C#Out和ref的区别
从C++角度讲解C#Out和ref的区别
|
8月前
|
C#
C#中out和ref之间的区别
C#中out和ref之间的区别
|
10月前
|
C#
C#基础⑧——方法(函数、重载、out、ref)
比喻成职能。比喻成一个生产自行车老板,一个地方专门放螺丝,一个地方专门放轮,一个地方专门放车链子,需要组装什么就从那个仓库里面拿就行了。各司其职。
|
关系型数据库 MySQL C#
【C#】【MySQL】【GridView】删除出现Parameter index is out of range
【C#】【MySQL】【GridView】删除出现Parameter index is out of range
95 0
【C#】【MySQL】【GridView】删除出现Parameter index is out of range
C# ref out的使用与区别
ref 关键字使参数按引用传递。其效果是,当控制权传递回调用方法时,在方法中对参数所做的任何更改都将反映在该变量中。若要使用 ref 参数,则方法定义和调用方法都必须显式使用 ref 关键字。Ref型参数引入前必须赋值。 out 关键字会导致参数通过引用来传递。这与 ref 关键字类似,不同之处在于 ref 要求变量必须在传递之前进行初始化。若要使用 out 参数,方法定义和调用方法都必须显式使用 out 关键字。 Out型参数引入前不需赋值,赋值也没用。
125 0
C# ref out的使用与区别
|
存储 C# C++
C#基础知识 之 ✨ ref 和 out 之间的江湖趣闻
引用参数和输出参数 按照国际惯例,要了解一个东西的时候,首先明白它是什么,然后明白它能做什么,最后要知道为什么。 所以在介绍ref和out之前要先简单了解一下什么是引用参数与输出参数,因为使用ref和out要有所了解
C#基础知识 之 ✨ ref 和 out 之间的江湖趣闻
|
.NET C# 开发框架
[C#]浅析ref、out参数
转载:http://www.cnblogs.com/vd630/p/4601919.html#top 按引用传递的参数算是C#与很多其他语言相比的一大特色,想要深入理解这一概念应该说不是一件容易的事,再把值类型和引用类型给参杂进来的话就变得更加让人头晕了。
969 0
|
21天前
|
开发框架 前端开发 .NET
C#编程与Web开发
【4月更文挑战第21天】本文探讨了C#在Web开发中的应用,包括使用ASP.NET框架、MVC模式、Web API和Entity Framework。C#作为.NET框架的主要语言,结合这些工具,能创建动态、高效的Web应用。实际案例涉及企业级应用、电子商务和社交媒体平台。尽管面临竞争和挑战,但C#在Web开发领域的前景将持续拓展。
|
21天前
|
SQL 开发框架 安全
C#编程与多线程处理
【4月更文挑战第21天】探索C#多线程处理,提升程序性能与响应性。了解C#中的Thread、Task类及Async/Await关键字,掌握线程同步与安全,实践并发计算、网络服务及UI优化。跟随未来发展趋势,利用C#打造高效应用。