ref和out 传递参数(C#)

1.参数传递默认都是传递栈空间里面存储的内容

2.如果添加了ref那么传递的都是栈空间地址,而不再是栈空间里面的内容

3.如果添加了out,那么传递的也是栈空间的地址

 1  //写一个方法计算一个int类型数组中每个元素的总和以及最大值和最小值
 2         /// <summary>
 3         ///
 4         /// </summary>
 5         /// <param name="intArray"></param>
 6         /// <returns></returns>
 7         static void GatValue(int[] intArray, ref int sum, ref int max, ref int min)
 8         {
 9
10             sum = 0;
11             max = intArray[0];
12             min = intArray[0];
13             for (int i = 0; i < intArray.Length; i++)
14             {
15                 //总和
16                 sum += intArray[i];
17
18                 //最大值
19                 if (max < intArray[i])
20                 {
21                     max = intArray[i];
22                 }
23
24                 //最小值
25                 if (min > intArray[i])
26                 {
27                     min = intArray[i];
28                 }
29             }
30         }

1  static void Main(string[] args)
2         {
3             int[] intArray={1,2,3,4,5,6,7,8,9,10};
4             int sum = 0, max = 0, min = 0;
5             //int sum = 0, max = 0, min;     //如果min变量在使用的时候,没有赋值,在使用ref关键字传递参数的时候,就会报错,错误消息:“使用了未赋值的局部变量”
6             GatValue(intArray, ref sum,ref max,ref min);
7             Console.Write(sum+" "+max+" "+min);
8             Console.ReadKey();
9         }

Mian函数

 1  static void Main(string[] args)
 2         {
 3             int[] intArray={1,2,3,4,5,6,7,8,9,10};
 4            // int sum = 0, max = 0, min = 0;
 5             int sum = 0, max = 0, min;
 6             GatValue(intArray, ref sum,ref max,out min);
 7             Console.Write(sum+" "+max+" "+min);
 8             Console.ReadKey();
 9         }
10
11
12
13   static void GatValue(int[] intArray, ref int sum, ref int max, out int min)
14         {
15
16             sum = 0;
17             max = intArray[0];
18             min = intArray[0];
19             for (int i = 0; i < intArray.Length; i++)
20             {
21                 //总和
22                 sum += intArray[i];
23
24                 //最大值
25                 if (max < intArray[i])
26                 {
27                     max = intArray[i];
28                 }
29
30                 //最小值
31                 if (min > intArray[i])
32                 {
33                     min = intArray[i];
34                 }
35             }
36         }

min变量out传递参数

 1   static void GatValue(int[] intArray, ref int sum, ref int max, out int min)
 2         {
 3             //这里要返回三个变量的值,只能是,通过返回值调用了
 4             sum = 0;
 5             max = intArray[0];
 6            // min = intArray[0];
 7             for (int i = 0; i < intArray.Length; i++)
 8             {
 9                 //总和
10                 sum += intArray[i];
11
12                 //最大值
13                 if (max < intArray[i])
14                 {
15                     max = intArray[i];
16                 }
17
18                 ////最小值
19                 //if (min > intArray[i])
20                 //{
21                 //    min = intArray[i];
22                 //}
23             }
24         }
25
26
27
28   static void Main(string[] args)
29         {
30             int[] intArray={1,2,3,4,5,6,7,8,9,10};
31            // int sum = 0, max = 0, min = 0;
32             int sum = 0, max = 0, min;
33             GatValue(intArray, ref sum,ref max,out min);
34             Console.Write(sum+" "+max+" "+min);
35             Console.ReadKey();
36         }

错误的例子,out参数在使用的时候,必须在方法体内,为变量赋值

这里第四个代码段,里面,使用了out参数传递的变量min,在方法体内没有被赋值,运行的时候会报错:“ 控制离开当前方法之前必须对 out 参数“min”赋值 “

区别:ref传递的参数必须先赋值再使用;

out可以赋值也可以不赋值,但是在方法体内必须重新赋值。

时间: 2024-11-13 09:46:54

ref和out 传递参数(C#)的相关文章

C# ref和out传递参数总结

如有雷同,不胜荣幸,若转载,请注明 C#中ref和out传递参数总结,两个都可用来传递参数,ref使用时必须先进行初始化,out则不需要,只要在返回之前赋值即可,文字废话到此,下面直接上例子 ref例子 Class A { private string name = string.Empty; private int count = 0; ... GetName(ref name,ref count); Console.Write(“姓名:” + name + ",数量:" + cou

传递参数ref与输出参数out

ref与out都可以在全局中改变传入的参数的值 但使用ref时,传入的参数必须已赋值,否则是非法的使用out时,传入参数可以未赋值,但无论如何都必须在方法中赋值 例: 1 static double a = 10; 2 static double b = 20; 3 4 static void Test(ref double x,out double y) 5 { 6 y = 0; //必须要在方法中赋值一下 7 x *= 10; 8 y *= 20; 9 Console.WriteLine(x

通过List&lt;String&gt;动态传递参数给 sqlcommand.Parameters

通过List<String>动态传递参数 private void GetallChecked_TreeNote(TreeNodeCollection aNodes, ref int TotalNodeCount, ref List<string> listItem) { foreach (TreeNode iNode in aNodes) { if (iNode.Nodes.Count == 0 && iNode.Checked==true) { richText

在 Angularjs 中 ui-sref 和 $state.go 如何传递参数

1 ui-sref.$state.go 的区别 ui-sref 一般使用在 <a>...</a>: <a ui-sref="message-list">消息中心</a> $state.go('someState')一般使用在 controller里面: .controller('firstCtrl', function($scope, $state) { $state.go('login'); }); 这两个本质上是一样的东西,我们看ui

.net中用Action等委托向外传递参数

原文:.net中用Action等委托向外传递参数      一般我们可以使用ref,out达到向外传递参数目的. Action<T>是一个特殊的委托,除了常规应用.我们还可以用它来实现简单地向外传递参数.直接看下面的UnitTest代码: 1: [TestMethod] 2: public void PassOutParametersUsingDelegate() 3: { 4: int i = 0; 5: string messgae = string.Empty; 6: int? adde

[C++11 并发编程] 03 向线程传递参数

我们可以通过std::thread的构造函数向线程传递参数,但是默认情况下,这些参数的拷贝会被传递到线程内部,即使参数申明为引用,也是如此: void f(int i,std::string const& s); std::thread t(f,3,"hello"); 如上面例子所示,创建了一个线程关联到t,它会调用f(3, "hello"),虽然f的第二个参数类型为std::string,但是实际上字面量hello还是以char const *类型传递到线

delphi的一些语法知识 以及参数传递问题,按引用方式传递参数,按值方式传递参数

//delphi中exit,abort,break,continue 的区别 exit: 退出函数体abort: 遇到异常,安静处理,就是不显示不提示break: 退出当前循环体,包括for ,while, repeat等循环体continue: 结束循环内的本次处理,继续从循环体的开始位置继续执行 Exit 是跳出当前代码块,也就是当前函数,跳出后是要继续向下执行的(如果有后续代码). Abort 是从 EAbort 过来的,可以激发 exception,其实质就是 Abort = Raise

向线程函数传递参数

向线程函数传递参数在构造线程对象时即可完成.但是要记住,默认情况下是把参数拷贝到线程内部,即使在函数中使用的是引用.例如 void f(int i,std::string const &s); std::thread t(f,3,"hello");</span> 上面代码中,函数f的第二个参数是std::string,传递的是char const *会转换为string. 当使用指针指向自动变量时,要特别注意: <span style="font-s

cpp 线程传递参数

目录 给thread传递参数的 多种情况: 传递字面值 传递字符数组当字符串, 为了安全还是转换成 string 更好. 向线程传递一个引用, 注意需要使用 ref 函数 thread 传递函数对象,需要注意,如果在 thread 构造参数里面构造对象,需要用"()"包起来 仿照 bind 将对象的成员函数作为线程的参数 向thread传递指针:普通指针和智能指针, 需要注意安全 unique_ptr的movable语义传递参数, 需要使用 move 函数 给thread传递参数的 多