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

简介:

     这篇继续聊聊 ”参数“的一些话题,我们知道参数大概有”默认参数“,”可选参数“,”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数组的,所以可以看出,又是一枚语法糖。


相关文章
|
5月前
|
缓存 NoSQL Java
面试~线程池-三大方法、七个参数、四种拒绝策略、实际应用
面试~线程池-三大方法、七个参数、四种拒绝策略、实际应用
46 0
|
8月前
|
Java
第二季:2.你说你做过JVM调优和参数配置,请问如何盘点查看JVM系统默认值 【Java面试题】
第二季:2.你说你做过JVM调优和参数配置,请问如何盘点查看JVM系统默认值 【Java面试题】
121 0
第二季:2.你说你做过JVM调优和参数配置,请问如何盘点查看JVM系统默认值 【Java面试题】
|
8月前
|
Java
第二季:9.线程池用过吗?生产上你如何设置合理参数【Java面试题】
第二季:9.线程池用过吗?生产上你如何设置合理参数【Java面试题】
83 0
|
10月前
|
SQL Java 数据库连接
【Mybatis】常见面试题:Mybatis获取参数值的两种方式?
【Mybatis】常见面试题:Mybatis获取参数值的两种方式?
|
10月前
|
缓存 前端开发 算法
web前端面试高频考点——Vue3.x深入理解(v-model参数用法、watch和watchEffect区别、Vue3快于Vue2、Vite启动快的原因)
web前端面试高频考点——Vue3.x深入理解(v-model参数用法、watch和watchEffect区别、Vue3快于Vue2、Vite启动快的原因)
254 0
|
监控 算法 Java
52.【面试宝典】面试宝典-JVM参数配置实战
【面试宝典】面试宝典-JVM参数配置实战
52.【面试宝典】面试宝典-JVM参数配置实战
|
缓存 算法 安全
51.【面试宝典】面试宝典-JVM参数概述
【面试宝典】面试宝典-JVM参数概述
51.【面试宝典】面试宝典-JVM参数概述
Java面试必问之线程池的创建使用、线程池的核心参数、线程池的底层工作原理
Java面试必问之线程池的创建使用、线程池的核心参数、线程池的底层工作原理
135 0
Java面试必问之线程池的创建使用、线程池的核心参数、线程池的底层工作原理
|
测试技术
软件测试面试题:为什么创建参数?
软件测试面试题:为什么创建参数?
65 0
|
测试技术
软件测试面试题:性能测试时,是不是必须进行参数化?为什么要创建参数?LoadRunner中如何创建参数?
软件测试面试题:性能测试时,是不是必须进行参数化?为什么要创建参数?LoadRunner中如何创建参数?
158 0

相关实验场景

更多