• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

C#当中的out关键字(借鉴于CSDN)

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

 

一丶与ref关键字一样,out关键字也是按引用来传递的.out 关键字会导致参数通过引用来传递。这与 ref 关键字类似,不同之处在于 ref 要求变量必须在传递之前进行初始化。若要使用 out 参数,方法定义和调用方法都必须显式使用 out 关键字

尽管作为 out 参数传递的变量不需要在传递之前进行初始化,但需要调用方法以便在方法返回之前赋值。

我们发现,ref和out似乎可以实现相同的功能.因为都可以改变传递到方法中的变量的值.但是,二者本质的区别就是,ref是传入值,out是传出值.在含有out关键字的方法中,变量必须由方法参数中不含out(可以是ref)的变量赋值或者由全局(即方法可以使用的该方法外部变量)变量赋值,out的宗旨是保证每一个传出变量都必须被赋值

示例演示了out关键字的使用方法,其功能是获取数组中的最大值和最大值的索引

 1 using System;
 2 using System.Collections.Generic;
 3 using System.Linq;
 4 using System.Text;
 5 using System.Threading.Tasks;
 6 
 7 namespace Out_Key
 8 {
 9     class Program
10     {
11         ///<summary>
12         ///求数组的最大值和最大值的索引
13         ///</summary>
14         ///<param name="m_Array" >传入的数组</param>
15         ///<param name="m_Index" >要求的最大索引</param>
16         ///<returns >数组中的最大值</returns>
17         static int MaxIndex(int[] m_Array, out int m_Index)
18         {
19             m_Index = 0;
20             int m_Max = m_Array[0];
21 
22             for (int i = 0; i < m_Array.Length; i++)
23             {
24                 if (m_Array[i] > m_Max)
25                 {
26                     m_Max = m_Array[i];
27                     m_Index = i;
28                 }
29             }
30 
31             return m_Max;
32         }
33         static void Main(String[] args)
34         {
35             int[] myArray = new int[5] { 56, 89, 425, 21, 21 };
36             int maxIndex;
37             Console.WriteLine("数组中最大的值为:{0}", MaxIndex(myArray, out maxIndex));
38             //调用MaxIndex方法后  maxIndex的值为2
39             Console.WriteLine("数组中最大的值是第{0}元素", maxIndex + 1);
40             Console.ReadKey();
41         }
42     }
43 }
View Code

result:

说明:

1.out 关键字会导致参数通过引用来传递。这与 ref 关键字类似,不同之处在于ref 要求变量必须在传递之前进行初始化。

2.方法定义和调用方法都必须显式使用 out 关键字。

3.属性不是变量,因此不能作为 out 参数传递。

二丶

 1 using System;
 2 using System.Collections.Generic;
 3 using System.Text;
 4 
 5 namespace sampsong
 6 {
 7     class Program1
 8     {
 9         static void Method(out String name,out String sex)
10         {
11             name = "张三";
12             sex="";
13         }
14 
15         static void Main(String[] args)
16         {
17             String Name;
18             String Sex;
19 
20             Method(out Name,out Sex);
21             Console.WriteLine("调用方法Method后");
22             Console.WriteLine("学生" + Name + "性别是:"+Sex );
23         }
24     }
25 }    
View Code
 1   static void Method(out int i)
 2         {
 3             i = 44;
 4         }
 5         static void Main()
 6         {
 7             int value;
 8             Method(out value);
 9             Console.Write(value);
10             // value is now 44
11             Console.ReadKey();
12         }
View Code

ref 和 out 关键字在运行时的处理方式不同,但在编译时的处理方式相同。因此,如果一个方法采用 ref 参数,而另一个方法采用 out 参数,则无法重载这两个方法。例如,从编译的角度来看,以下代码中的两个方法是完全相同的,因此将不会编译以下代码:

class class Program
{
        public void TestMethod(out int i) {    }
        public void TestMethod(ref int i) {    }
}

如果一个方法采用 ref 或 out 参数,而另一个方法不采用这两类参数,则可以进行重载,如下所示:

 public void TestMethod(int i) { }
 public void TestMethod(out int i) {
            i = 1;
 }

属性不是变量,因此不能作为 out 参数传递。

有关传递数组的信息,请参见使用 ref 和 out 传递数组。 
当希望方法返回多个值时,声明 out 方法很有用。使用 out 参数的方法仍然可以将变量用作返回类型(请参见 return),但它还可以将一个或多个对象作为 out 参数返回给调用方法。此示例使用 out 在一个方法调用中返回三个变量。请注意,第三个参数所赋的值为 Null。这样便允许方法有选择地返回值。

 1 class Program
 2 {
 3         static void Method(out int a, out string b, out string c)
 4         {
 5                 a = 44;
 6                 b = "I've been returned";
 7                 c= null;
 8         }
 9         static void Main()
10         {
11                 int value;
12                 string str1, str2;
13                 Method(out value, out str1, out str2);
14         }
15 }
View Code

 三丶yield

1. yield必须出现在IEunmerable中

2. yield是迭代器的状态机,能做到延迟查询,使用的时候才查询,可以实现按序加载

四丶Ref和Out

C#有两种参数传递方式:传值和引用,传值就是变量的值,而引用则是传递的变量的地址;

本文中说的Ref和Out都是引用传递,Ref的重点是把值传给调用方法,Out则是得到调用方法的值,类似于有返回类型的方法返回的值;

在使用两者时一定要注意一下两点,否则编译出现错误

a) ref 变量使用前要先声明同时要赋值 a=20;

b)方法调用参数要加上相应的关键字 ref or out;

static void main()
{
   int a = 20;
   int b = 30;
   int c;
   SwapMethod(ref a, ref b);
   Console.WriteLine(" After Swap a is {0},b is {1} ",a,b);

   OutTest(out c);
   Console.WriteLine("The out value is {0}.",c);
}

static void SwapMethod(ref int a,ref int b)
{
     int tem;
     tem = a;
     a = b;
     b = tem;
}

static void OutTest(out int a)
{
   a = 10 * 10;
}

 


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
热门推荐
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap