关于“参数”的几个问题,也许面试会问到哦~

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

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

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

static void Main(string[] args)
        {
            int k = 0;

            Run(k++, k++, k++);
        }

        static void Run(int i, int j, int m)
        {
            //最后的m等于多少
            Console.WriteLine(m);
        }

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[]更有语意,比如下面代码,能说明下它的实现原理吗?

public class Program
    {
        static void Main(string[] args)
        {
            Add(new int[3] { 1, 2, 3 });

            //是不是有更好的语意
            AddRange(1, 2, 3);
        }

        /// <summary>
        /// 这里必须传递int[]数组
        /// </summary>
        /// <param name="nums"></param>
        static void Add(int[] nums)
        {

        }

        /// <summary>
        /// 这里直接传递数据元素值即可,不需要int[]
        /// </summary>
        /// <param name="nums"></param>
        static void AddRange(params int[] nums)
        {

        }
    }

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

      看下IL代码。

         

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

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

时间: 2024-09-24 04:57:20

关于“参数”的几个问题,也许面试会问到哦~的相关文章

关于“构造函数”中的几个小问题,也许面试会问到哦~

 构造函数这玩意也是面试官经常会问到的东西,我们知道一个类的状态初始化就全靠它了,下面提几个小问题. Q:我看到Web项目里面通常都有一个BasePage页面,其中构造函数里面做了权限验证,      请问为什么要这么做. A:  既然这么做了,那么设计者肯定就知道了一个原则就是实例构造器中,父类构造器先于子类执行,那么这个先执行就可      以做很多有意思的事情,比如你说的权限验证,可能有人会问为什么要先于子类执行,刚才我也说了,构造函数是用于      初始化本类状态的,这也叫"先扫屋子再

关于“属性”的几个问题,也许面试会问到哦~

         这些天太忙了都没更新博客了,这篇我们继续聊聊"属性",大家都知道,属性其实分两种,无参属性和有参属性,顾名思义 无参属性就是我们平时用到的 "属性",有参属性就是我们所说的 "索引器", 1 public class Bird 2 { 3 public int Age { get; set; } 4 5 public string this[int i] { get { return i + string.Empty; } se

神奇的decimal,也许面试会问到哦~

继续扯,为什么说decimal神奇呢,大家都知道decimal是基元类型,但是 这个decimal类型在IL中居然没有相应的IL指令,也就是说CLR根本不认识decimal,全是编译器这一层在糊弄我们.      话不多说,看下最simple的例子,(加了点注释方便理解) static void Main(string[] args) { //居然调用了有参构造函数 decimal d = 1; //直接将常量10推送到计算堆栈,然后将10放入局部变量索引为1的位置,也就是i int i = 1

tomcat-http无response问题排查(面试被问到)

问题描述 http无response问题排查(面试被问到) 今天面试一家公司被问到说:项目部署在tomcat上,一直运行的好好的,突然有一天发出的请求没有response回应了,就是http协议发出了request,却没有response返回.已知查看了防火墙没有问题,程序不报错,tomcat进程和相应的端口都活的好好的,日志文件也没有什么异常,问下面该如何排查问题,有可能有那些原因?求解答!!!!! 解决方案 我遇到过这类问题,排查方式如下:首先通过wireshare在服务器上进行抓包,通过抓

9-patch-点九图,为什么只能是黑色的,或者纯色的,被面试官问了这个问题

问题描述 点九图,为什么只能是黑色的,或者纯色的,被面试官问了这个问题 5C 请问该如何回答,如果答案是:编译不通过,请不要回答,必须要知道更深层的原因是什么,谢谢 解决方案 .9图的上下左右都留有1px的空间,用来给你画线,只有划线的地方才可以或者缩小,而且这条线在图片上看不出到.但是在Android Studio中,如果.9图少了上下左右的一边,会编译不过去,没听说颜色有什么问题. 解决方案二: 只有黑色和纯色拉伸是最清晰的吧,其实相当于把一张png图分成了9个部分(九宫格),分别为4个角,

javaeye-在不使用线程的情况下 如何实现session 。 被面试官问到的一个问题

问题描述 在不使用线程的情况下 如何实现session . 被面试官问到的一个问题 如题 参加面试的时候 一个考官问到的问题 ,没有答上来 .不知道java中在不使用 线程的情况下 还能怎么去实现定时功能 解决方案 不使用线程可以通过轮询去实现定时.

winform-请教:C# winfrom面试一般问哪些问题?

问题描述 请教:C# winfrom面试一般问哪些问题? 如题,请过来人讲讲~越具体越好哦 ,有过来人讲讲经验吧 ,小弟多谢多谢了 解决方案 买一本.net面试宝典,里面有.网上也能下载. 解决方案二: 直接去百度搜一下面试题,很多,看几个就知道,差不多的 解决方案三: 百度.net面试宝典,

朋友面试被问到---静态构造函数

原文:朋友面试被问到---静态构造函数 事情是这样的 朋友是一个一年多经验的.Net开发人员 在面试新公司的时候,被面试官问到什么是"静态构造函数" 朋友回来告诉我, "构造函数还有静态的吗,看来这次面试要黄了" "对的,构造函数是有静态的啊,不过也难怪,很少人会用到,看来面试官是要看你的基础有多深啊!"   静态构造函数   我们知道,所有的静态成员,包括静态字段和静态方法,当程序运行遇到这些静态成员所在的类 在创建对象或者调用静态成员的时候,

阿里JAVA开发面试常问问题总结

我的博客:CODE大全:www.codedq.net:业余草:www.xttblog.com:爱分享:www.ndislwf.com或ifxvn.com. 线程与进程进程是可并发执行的程序在某个数据集合上的一次计算活动,也是操作系统进行资源分配和调度的基本单位.线程是操作系统进程中能够并发执行的实体,是处理器调度和分派的基本单位.每个进程内可包含多个可并发执行的线程.线程自己基本不拥有系统资源,只拥有少量必不可少的资源:程序计数器.一组寄存器.栈.同属一个进程的线程共享进程所拥有的主存空间和资源