返回顶部
首页 > 资讯 > 精选 >如何分析CLR Via的方法及参数
  • 392
分享到

如何分析CLR Via的方法及参数

2023-06-17 22:06:31 392人浏览 八月长安
摘要

如何分析CLR Via的方法及参数,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。通常我们在使用方法的时候,方法的参数是按值传递的,如果传递的参数是引用类型的对象,是将引用对象的

如何分析CLR Via的方法及参数,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。

通常我们在使用方法的时候,方法的参数是按值传递的,如果传递的参数是引用类型的对象,是将引用对象的地址传给方法。如果传递的是值类型实例,传递给方法的是该实例的一个副本。CLR Via允许使用在方法中按引用来传递参数,C#中使用out和ref关键字来体现。下面就来介绍out和ref的使用。

1、CLR Via之out

(1)使用out时在方法的参数定义和方法的调用时都要用out关键字,如下:

static void Main(string[] args)            {                string name = string.Empty;                GetStr(out name); //调用时加out                Console.WriteLine(name);            }            private static void GetStr(out string name) //方法参数定义时的out            {                name = "oec2003";           }

(2)如果一个方法有out修饰的参数,在方法结束前必须给给参数赋值,否则不能通过编译,代码如下:   

static void Main(string[] args)        {            string name = "oec2003";            GetStr(out name);            Console.WriteLine(name);        }        private static void GetStr(out string name)        {            //没有给name赋值,编译时会出现“控制离开当前方法之前必须对 out 参数“name”赋值”异常        }

(3)在调用有out参数的方法时,没有必要给out参数赋初始值,因为赋的值不会传递到方法的内部,如果在方法的内部要强行使用out参数会有编译错误。代码看下面,通常我们需要在一个方法中返回多个值的时候就可以使用out参数。和out参数一样,使用ref时在方法的参数定义和方法的调用时都要用ref关键字。和out不同的是ref参数的值可以传入方法内进行操作。

static void Main(string[] args)       {           string name = "oec2003"; //给out参数name赋初始值oec2003           GetStr(out name);           Console.WriteLine(name);       }       private static void GetStr(out string name)        {           name = "hello" + name; //name在调用前虽赋值为oec2003 ,                                      //但此处会报错“使用了未赋值的 out 参数name”       }

(4)如果两个方法的参数个数和类型都相同,区别只是其中一个为out参数,那么这两个方法是可以进行重载的,下面的代码可以正常运行。    

2、CLR Via之ref

private static void GetStr(out string name)         {            name = "oec2003";        }        private static void GetStr(string name)        {            name = "oec2003";        }

(1)如果调用方法前,ref参数没有赋初始值,不能通过编译,看如下代码:

static void Main(string[] args)         {              string name;              GetStr(ref name); //如果name没有赋值不能通过编译              Console.WriteLine(name);          }          private static void GetStr(ref string name)           {              name = "oec2003";         }          static void Main(string[] args)          {              string name="oec2003";              GetStr(ref name);              Console.WriteLine(name);//返回:hello oc2003         }          private static void GetStr(ref string name)           {              name = "hello " + name;         }

(2) 因为ref在传入方法时会有初始值,所以在方法的内部可以不对ref参数进行任何的操作,那样ref参数的值不会改变。

static void Main(string[] args)          {              string name="oec2003";              GetStr(ref name);              Console.WriteLine(name);//在方法中没有操作,仍然返回oec2003          }          private static void GetStr(ref string name)           {                ......       }

(3)同out参数一样,如果两个方法的参数个数和类型都一样,仅有的区别只是其中之一的参数为ref参数,两个可以进行重载。

对于CLR Via来说,关键字out和关键字ref是等价的,就是说无论使用的out还是ref,都会生成相同的IL代码,正因为如此,如果两个方法的差异仅仅是out和ref的差异,那么这两个方法是不能进行重载的,如下代码:

//下面代码编译会报“不能定义仅在 ref 和 out 上有差别的重载方法”异常           private static void GetStr(ref string name)            {               name = "oec2003";           }           private static void GetStr(out string name)           {               name = "oec2003";           }

3、CLR Via之可变数量的参数

有些时候如果一个方法的参数数量可以根据用户的需要而进行变动,那将会带来很大的方便。像String类型的Concat、FORMat等方法就提供了可变参数。可以变参数在C#中使用params来定义,如下面代码:

static void Main(string[] args)         {             Console.WriteLine(Add(1,2,3,4));         }         public static int Add(params int[] num)         {             int sum = 0;             foreach (int i in num)             {                sum += i;            }            return sum;        }

使用可变参数非常简单,需要注意的是可变参数的类型一定要是数组类型。可变参数虽然很好用,但是接受可变参数的方法在调用时会导致一些性能损失,以为数组对象必须分配在堆上,数组的内存最终需要GC来回收。为了避免这种性能的损耗,我们在写方法的时候可以多定义几个没有params关键字的方法的重载,这样只有在很特殊的情况下才会使用有params关键字的方法。

4、CLR Via之方法的参数类型

声明方法参数类型时,应尽可能只用弱的类型,例如如果要编写一个操作一组数据项的方法,***使用接口(如Ienumerable)来定义方法参数的类型,而不要使用一些强的数据类型如List或是一些强的接口类型(如Ilist或Icollection),如下: 

//使用的弱类型参数            private void OperateCollection<T>(IEnumerable<T> collection)            {                         }            //使用的强类型参数            private void OperateCollection<T>(List<T> collection)            {               ......         }

此处所指的强类型和弱类型,可以理解为类型的层次,如果说父类的层次高于子类,那么层次越高就类型越弱。Iemumerable接口直接在 System.Collections 命名空间下,是其他一些集合类和接口(如Icollection IList List等)的基类,所以定义参数为IEnumerable 类型的,凡是继承了IEnumerable 的类型的参数都能够传入方法,大大提高了灵活性。

看完上述内容,你们掌握如何分析CLR Via的方法及参数的方法了吗?如果还想学到更多技能或想了解更多相关内容,欢迎关注编程网精选频道,感谢各位的阅读!

--结束END--

本文标题: 如何分析CLR Via的方法及参数

本文链接: https://lsjlt.com/news/293400.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • 如何分析CLR Via的方法及参数
    如何分析CLR Via的方法及参数,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。通常我们在使用方法的时候,方法的参数是按值传递的,如果传递的参数是引用类型的对象,是将引用对象的...
    99+
    2023-06-17
  • 如何进行JVM参数设置及分析
    本篇文章给大家分享的是有关如何进行JVM参数设置及分析,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。不管是YGC还是Full GC,GC过程中都会对导致程序运行中中断,正确的选...
    99+
    2023-06-17
  • $.Ajax()方法参数的示例分析
    这篇文章给大家分享的是有关$.Ajax()方法参数的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。Ajax概念AJAX即“Asynchronous Javascript ...
    99+
    2024-04-02
  • Assert.assertEquals()方法参数的示例分析
    这篇文章主要介绍了Assert.assertEquals()方法参数的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。junit.framework包下的Assert提...
    99+
    2023-06-22
  • jquery中ajax方法的参数属性及作用实例分析
    这篇“jquery中ajax方法的参数属性及作用实例分析”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起...
    99+
    2024-04-02
  • 如何分析.Net Compact Framework CLR中的JIT编译器
    如何分析.Net Compact Framework CLR中的JIT编译器,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。这个.Net Compact Framework CL...
    99+
    2023-06-17
  • POST方法给@RequestBody传参数失败的解决及原因分析
    目录POST方法给@RequestBody传参数失败@RequestBody参数映射不上,@RequestBody报错言归正传问题是这样的报错原因POST方法给@RequestBod...
    99+
    2024-04-02
  • Python的requests参数及方法
    介绍 Python的requests模块是一个常用的HTTP库,用于发送HTTP请求和处理响应。下面是requests模块的一些常用参数和方法的介绍: 安装 要使用requests模块,首先需要安装它...
    99+
    2023-10-25
    python 开发语言
  • 如何进行mysql的innodb_flush_log_at_trx_commit参数分析
    这期内容当中小编将会给大家带来有关如何进行mysql的innodb_flush_log_at_trx_commit参数分析,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。 ...
    99+
    2024-04-02
  • 如何解析sql_slave_skip_counter 参数的用法
    如何解析sql_slave_skip_counter 参数的用法,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。这里浅析一下sql_slave_skip_coun...
    99+
    2023-06-06
  • 如何进行SpringMVC在Controller层方法的参数解析
    本篇文章为大家展示了如何进行SpringMVC在Controller层方法的参数解析,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。使用版本:spring-boot: 2.1.6.RELEASEspi...
    99+
    2023-06-22
  • Mysql的Procedure参数如何为NULL问题分析
    本篇文章给大家分享的是有关Mysql的Procedure参数如何为NULL问题分析,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。 最近写过程...
    99+
    2024-04-02
  • Python 解析参数的三种方法
    Let's go!我们以机器学习当中的调参过程来进行实践,有三种方式可供选择。第一个选项是使用 argparse,它是一个流行的 Python 模块,专门用于命令行解析;另一种方法是读取 JSON 文件,我们可以在其中放置所有超参数;第三种...
    99+
    2023-05-14
    代码 Python 参数
  • 如何分析C++函数参数引用问题
    这期内容当中小编将会给大家带来有关如何分析C++函数参数引用问题,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。在C++函数参数中,使用了引用作形参,调用时所对应的实参应该是一个数组名,这里的引用是给数组起...
    99+
    2023-06-17
  • linux中kill命令的参数以及示例分析
    linux中kill命令的参数以及示例分析,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。   kill号令用于终止指定的过程(terminate a pro...
    99+
    2023-06-05
  • Stream、WshShell、WshUrlShortcut对象及Shell.Application参数的示例分析
    这篇文章将为大家详细讲解有关Stream、WshShell、WshUrlShortcut对象及Shell.Application参数的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。1.Stream...
    99+
    2023-06-08
  • numpy函数常用参数和用法的分析
    解析numpy函数的常用参数与用法 numpy是Python中常用的数值计算库,提供了丰富的数值运算函数和数据结构,能够方便快捷地进行数组运算和数值计算。本文将解析numpy函数的常用参数与用法,并提供具体的代码示例。 一、nu...
    99+
    2024-01-26
    参数 用法 数组
  • 数据分析的方法
    数据分析的方法有:对比分析法,分组分析法,预测分析法,漏斗分析法,AB测试分析法,象限分析法,公式拆解法,可行域分析法,二八分析法,假设性分析法。数据分析的方法有:对比分析法,分组分析法,预测分析法,漏斗分析法,AB测试分析法,象限分析法,...
    99+
    2023-07-10
  • C++ 可变参数的语法及规则解析
    c++++ 可变参数允许函数接受任意数量的参数,语法为:returntype functionname(type1 arg1, ..., typen argn, ...)。规则包括:必须...
    99+
    2024-04-20
    c++ 可变参数
  • Bootstrap table中toolbar新增条件查询及refresh参数使用方法的示例分析
    这篇文章将为大家详细讲解有关Bootstrap table中toolbar新增条件查询及refresh参数使用方法的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作