第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定

關(guān)于“參數(shù)”的幾個(gè)問(wèn)題

標(biāo)簽:
資訊

 

     这篇继续聊聊 ”参数“的一些话题,我们知道参数大概有”默认参数“,”可选参数“,”ref参数“,”out参数“以及”可变参数“。

下面提几个小问题,可能在面试中会被问到。

 

Q:请问我按照如下方式传递参数的时候,最后的m等于多少?

复制代码

 1         static void Main(string[] args) 2         { 3             int k = 0; 4  5             Run(k++, k++, k++); 6         } 7  8         static void Run(int i, int j, int m) 9         {10             //最后的m等于多少11             Console.WriteLine(m);12         }

复制代码

 

A: 不管这个问题算不算小儿科,既然被问到了,并且又是在参数这个博文里面,当然要么直接加等于2,要么就是0,如果你在

    局部代码区域直接写k++,那么毫无疑问的就是k=k;k=k+1,也就是先赋值再自增,那如果作为参数的话,还是一样吗?

    答案当然就在IL里面。

   

从IL上我们看的很清楚,即使++操作是作为参数的形式,也是依次执行了三个add,然后add完之后再call我们的run方法。

最后得到结果毫无疑问就是2了。

 

Q:我知道默认参数是C#4.0的新特性,难道它又是一块语法糖吗?

1         static void Run(int i = 4)2         {3 4         }

A: 可以这么说的,我们知道C#有一个限制,就是默认值必须是编译时就能确定的常量值,既然是常量值,那么这个值就一定

    会嵌入到程序集的元数据中,老规矩,继续看下生成的IL代码。

如果你仔细观察,你会发现有两个不同的地方。

①:参数列表中的opt,这个参数其实就是编译器给该参数打上了OptionalAtrribute标记,既然是特性,它也会嵌入到程序集

     的元数据中,下面看下它的源代码会发现没什么有价值的地方,就是标记这个参数是不是可选的。

 

② 我们会发现有一个param参数,其实这个参数就是编译器给参数打上的一个默认值的标记,继续看下源代码。

这里我们发现有一个构造函数,需要传递一个默认值,而这个默认值取自我们定义的常量值,也就是4.

所以综合来说,确实是一块语法糖,其实真实的代码应该是这样,只是赋值操作给了编译器。

1         static void Run(int i)2         {3             i = 4;4 5             //....6         }

 

Q:我知道Param有些场景会比int[]更有语意,比如下面代码,能说明下它的实现原理吗?

复制代码

 1     public class Program 2     { 3         static void Main(string[] args) 4         { 5             Add(new int[3] { 1, 2, 3 }); 6  7             //是不是有更好的语意 8             AddRange(1, 2, 3); 9         }10 11         /// <summary>12         /// 这里必须传递int[]数组13         /// </summary>14         /// <param name="nums"></param>15         static void Add(int[] nums)16         {17 18         }19 20         /// <summary>21         /// 这里直接传递数据元素值即可,不需要int[]22         /// </summary>23         /// <param name="nums"></param>24         static void AddRange(params int[] nums)25         {26 27         }28     }

复制代码

 

A:  确实在add的场景下语意大增了不少,同时也让我少写了一些代码,那么到底param是如果做到的呢?我们继续

      看下IL代码。

         

从IL中上可以看到,其实所谓的调用方,即:AddRange(1, 2, 3); 它在调用之前已经new了一个arr,并且将1,2,3

加入到arr中去了,然后再调用AddRange数组的,所以可以看出,又是一枚语法糖。

好了,大概就这样了,夜深了,睡觉了。

 

點(diǎn)擊查看更多內(nèi)容
TA 點(diǎn)贊

若覺(jué)得本文不錯(cuò),就分享一下吧!

評(píng)論

作者其他優(yōu)質(zhì)文章

正在加載中
  • 推薦
  • 評(píng)論
  • 收藏
  • 共同學(xué)習(xí),寫(xiě)下你的評(píng)論
感謝您的支持,我會(huì)繼續(xù)努力的~
掃碼打賞,你說(shuō)多少就多少
贊賞金額會(huì)直接到老師賬戶(hù)
支付方式
打開(kāi)微信掃一掃,即可進(jìn)行掃碼打賞哦
今天注冊(cè)有機(jī)會(huì)得

100積分直接送

付費(fèi)專(zhuān)欄免費(fèi)學(xué)

大額優(yōu)惠券免費(fèi)領(lǐng)

立即參與 放棄機(jī)會(huì)
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢(xún)優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)

舉報(bào)

0/150
提交
取消