首先我们要知道ref和out在C#里面是什么? 答:它们俩是C#里面的关键字。 他们俩是干啥的呢? 答:他们俩是要领参数的修饰标记,一但使用,要领界说和要领都用都要使用这个关键字,这一点是死规定。
好了空话不久不多说,既然是修饰符,使用了他们必然是要有意义的对吧。我们先来看一手微软官方界说。
如果大家通过上面微软官方的界说大白了这个参数。那很好,下面的我写的就不需要看啦!还有疑惑就继续往下看。保证你能懂。
这里我先不直接讲解,我先掏出一手代码,然后通过代码讲解。
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace ref和outTest { class Program { static void Main(string[] args) { int i = 0; Test(i); Console.WriteLine(i.ToString()); Console.ReadKey(); } static void Test(int i) { i++; Console.WriteLine(i.ToString()); } } }
这代码没啥含量,学过代码都看到懂的,就是界说个i变量,然后挪用Test要领,要领里面对i进行+1的操纵然后打印i的值,main函数里也打印一次i的值。
功效大家应该也都知道 要领里面打印的是main要领打印的是0,要领里面是1。
因为默认情况下,我们要领通报变量默认是是"值通报"的方法。这是什么意思呢?说到这里要先解释下引用类型和值类型,可以看我的一篇博客----->传送门。我这里简单说下。引用类型的值存的是指向东西自己或者值的地点,值类型的变量存的是东西的自己或者是值。一个经典的比方,值类型就是报纸,引用类型就是网页。我看报纸就要买一份报纸。我得到的就是实际的报纸,但是我浏览网页只要输入一个Url地点。Url指向了实际网站内容。
解释完毕,我们再把思路拉回来,我们说要领通报的变量默认是"值通报"。就是说我报纸看的哈哈大笑,这时候小明也想看。我就又买了一份给他。但是我们看的内容是一样的。但是我的报纸还是我的报纸。小明看完报纸就撕了报纸都不影响我,值通报就是要领的变量的值通报值之后。岂论要领里面对这个值进行了什么操纵。都不影响我要领外面的i。所以这个处所输出的功效是 1和0
我感受上面应该讲的还挺易懂的吧,还有疑问算我掉败。
接下来我们加上Ref关键字了,改一手代码
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace ref和outTest { class Program { static void Main(string[] args) { int i = 0; Test(ref i); Console.WriteLine(i.ToString()); Console.ReadKey(); } static void Test(ref int i) { i++; Console.WriteLine(i.ToString()); } } }
ref关键字,文章的开头微软的官方解释已经说明了。使用了Ref参数之后,,要领参数的通报是按"引用通报"的,"引用通报"什么意思上面讲解我也解释了。举个例子,这就好比我看到某某网站不顺眼。就找了一个黑客,然后把网站地点报告了黑客,让它帮我黑了这个网站。让黑客在网站的首页显示"一小时小超人最帅的字",要特大号显示,那黑客就会通过我给的Url黑了这个网站的处事器。然后我一刷新网页。这个网页就显示了"一小时小超人最帅"。
这个代码也是一样。加了ref 之后 i变量通报是东西的引用也是网页的Url,要领内部改削是通过这个地点找了真的值然后进行改削,所有外面的i也产生了变革。
讲到这里大家应该大白了吧。