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

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

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

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

 using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks; namespace Out_Key
{
class Program
{
///<summary>
///求数组的最大值和最大值的索引
///</summary>
///<param name="m_Array" >传入的数组</param>
///<param name="m_Index" >要求的最大索引</param>
///<returns >数组中的最大值</returns>
static int MaxIndex(int[] m_Array, out int m_Index)
{
m_Index = ;
int m_Max = m_Array[]; for (int i = ; i < m_Array.Length; i++)
{
if (m_Array[i] > m_Max)
{
m_Max = m_Array[i];
m_Index = i;
}
} return m_Max;
}
static void Main(String[] args)
{
int[] myArray = new int[] { , , , , };
int maxIndex;
Console.WriteLine("数组中最大的值为:{0}", MaxIndex(myArray, out maxIndex));
//调用MaxIndex方法后 maxIndex的值为2
Console.WriteLine("数组中最大的值是第{0}元素", maxIndex + );
Console.ReadKey();
}
}
}

result:

说明:

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

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

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

二丶

 using System;
using System.Collections.Generic;
using System.Text; namespace sampsong
{
class Program1
{
static void Method(out String name,out String sex)
{
name = "张三";
sex="男";
} static void Main(String[] args)
{
String Name;
String Sex; Method(out Name,out Sex);
Console.WriteLine("调用方法Method后");
Console.WriteLine("学生" + Name + "性别是:"+Sex );
}
}
}
   static void Method(out int i)
{
i = ;
}
static void Main()
{
int value;
Method(out value);
Console.Write(value);
// value is now 44
Console.ReadKey();
}

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 = ;
}

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

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

 class Program
{
static void Method(out int a, out string b, out string c)
{
a = ;
b = "I've been returned";
c= null;
}
static void Main()
{
int value;
string str1, str2;
Method(out value, out str1, out str2);
}
}

 三丶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 = ;
int b = ;
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 = * ;
}

C#当中的out关键字(借鉴于CSDN)的更多相关文章

  1. 浅谈C#当中的out关键字(转载)+说明

    与ref关键字一样,out关键字也是按引用来传递的. 示例演示了out关键字的使用方法,其功能是获取数组中的最大值和最大值的索引 using System; using System.Collecti ...

  2. swift 2中关键字和解释整理

    1.swift 最新关键字和符号参考:https://developer.apple.com/library/mac/documentation/Swift/Conceptual/Swift_Prog ...

  3. java基础之关键字static

        在java当中有很多关键字,static便是其中一个,它很普通但我们经常需要运用到它,所以要了解static是非常有必要的.   鉴于本人知识结构有限,若有错误忘不吝赐教,甚为感谢.   一. ...

  4. C++11 带来的新特性 (3)—— 关键字noexcept

    1 关键字noexcept 从C++11开始,我们能看到很多代码当中都有关键字noexcept.比如下面就是std::initializer_list的默认构造函数,其中使用了noexcept. co ...

  5. MySQL中any、some、all关键字

    MySQL中any.some.all关键字http://blog.csdn.net/imzoer/article/details/8266324 ANY关键字: 假设any内部的查询语句返回的结果个数 ...

  6. php学习十三:其他关键字

    在php中,其实不止在php中,在其他语言中我们也会常常接触到一些关键字,整理了一下php当中的一下关键字,可能有些不全,希望大家指出来,多多交流,一起进步. 1.final 特性:1.使用final ...

  7. 康冕峰IT技术总结博客CSDN索引

    计算1-x内的质数, 结果保存在mysql中. Java 程序员面试笔试宝典 4.1基础知识https://blog.csdn.net/qq_40993412/article/details/1040 ...

  8. php long time(1)

    好久好久没有发表新的文章了,主要是懒得在这里写,都记在记事本上,所得都是自己理解的情况下写的,如今借此闲暇记录下来,:::: ****************PHP****************** ...

  9. 基础算法-查找:线性索引查找(I)

    前面介绍的几种查找的算法都是基于数据有序的基础上进行的.但是在实际的应用中,很多数据集可能有惊人的数据量,面对这些海量的数据,要保证记录全部按照当中的某个关键字有序,其时间代价是非常昂贵的,所以这种数 ...

随机推荐

  1. ExtJs--09--javascript对象的方法的3种写法 prototype通过原型设置方法效率最好

    /** * javascript对象的方法的3种写法 推荐第三种 运行效率最好 */ function P(name , age){ this.name = name ; this.age = age ...

  2. JAVA 网络长短连接

       作为java的刚開始学习的人,看了网上的资料后,关于java的长短连接,感觉理解的不是非常深刻.结合自己的学习和网上的资料整理例如以下.不对之处请大家批评指正.                  ...

  3. 虚拟机ODPS初体验

    大数据竞赛的第二阶段须要通过远程桌面的方式连接阿里提供的虚拟机, 全部操作都是在远程主机上进行. 在搞清楚文件回传方式之前真是各种麻烦(写博客都没有办法贴代码). 用了两个上午初步上手, 希望接下来进 ...

  4. linux下的epoll怎样高效处理百万连接

    开发高性能网络程序时.windows开发人员们言必称iocp,linux开发人员们则言必称epoll.大家都明确epoll是一种IO多路复用技术,能够很高效的处理数以百万计的socket句柄,比起曾经 ...

  5. cocos2d-x 执行在 genymotion上面

    1.jni/Application.mk加入红色圆圈内的參数 watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQveWl6aXhpYW5zaGVuZw==/fon ...

  6. Java中去除字符串中的空格

    1.去掉首尾的空格 String.trim()  trim()是去掉首尾空格 2.去掉所有的空格 str.replace(" ", ""); 去掉所有空格,包括 ...

  7. Road Construction(无向图的双连通分量)

    http://poj.org/problem?id=3352 题意:给出一个有n个顶点m条边的无向连通图,问至少添加几条边,使删除任意一条边原图仍连通. 思路:一个边双连通图删除任意一条边仍为连通图. ...

  8. P3299 [SDOI2013]保护出题人

    传送门 全世界都会二分可海星-- 首先记\(sum[i]\)为\(a[i]\)的前缀和,那么第\(i\)个的答案就是\(max\{\frac{sum[i]-sum[j-1]}{x+(i-j)d}\}\ ...

  9. [Swift通天遁地]五、高级扩展-(3)日期和时间类型的扩展方法

    ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★➤微信公众号:山青咏芝(shanqingyongzhi)➤博客园地址:山青咏芝(https://www.cnblogs. ...

  10. hastable 用法

    一,哈希表(Hashtable)简述 在.NET Framework中,Hashtable是System.Collections命名空间提供的一个容器,用于处理和表现类似keyvalue的键值对,其中 ...