有关.NET参数传递的方式引发的思考

下面就简单的介绍一下.NET的一些常用参数用法,如有不足还望指正,也欢迎大家在下面留言讨论,分享自己的见解。

一.DotNet参数概述:

.NET中参数(形式参数)变量是方法或索引器声明的一部分,而实参是调用方法或索引器时使用的表达式。

在CLR中,默认的情况下所有的方法参数都是传值的。在传递引用类型的对象时,对一个对象的引用会传递给方法。这里的船引用本身是以传值的方式传给方法的。这也意味着方法能够修改对象,而调用者能看到这些修改。对于值类型的实例,传给方法的实例的一个副本。意味着方法将获得它专用的一个值类型实例副本,调用者中的实例不受影响。

在CLR中允许以传引用而非传值的方式传递参数,在C#中使用out和ref来实现传递引用的方式传值。在C#中使用out和ref来实现传递引用的方式传值,这两个关键字告诉编译器生成元数据来指明该参数是传引用的,编译器将生成代码来传递参数的地址,而不是传递参数本身。为值类型使用out和ref,效果等同于以传值的方式传递引用类型。  

常用的参数主要有基本类型参数,泛型参数,以及<in T>和<out T>,dynamic等等。例如<in T>和<out T>,在CLR中支持泛型类型的可变性,C#在4.0时获得了生命泛型遍体所必须的语法,并且现在编译器也能够知道接口和委托可能的转换。可变性是以一种类型安全的方式,讲一个对象作为另一个对象来使用。可变性应用于泛型接口和泛型委托的类型参数中。协变形用于向调用者返回某项操作的值;逆变性是指调用者想API传入值;不变性是相对于协变性和逆变性,是指什么也不会发生。对于这方面的知识非常的丰富,有兴趣的可以自行了解,这里就不做详细的介绍了。dynamic类型,C#是一门静态类型的语言,在某些情况下,C#编译器要寻找特定的名称而不是接口。dynamic可以在编译时做任何事,到执行时再由框架进行处理。有关动态类型的介绍也不做更深入的介绍。

在.NET中参数的使用方法主要为可选参数、命名参数、可变数量参数等等。本文下面也是主要介绍这三种参数的使用方法。

二.DotNet参数用法:

以下是主要介绍三种参数的用法:可选参数;命名实参;传递可变数量的参数。  

1.可选参数:

  (1).基本用法:

如果某个操作需要多个值,而有些值在每次调用的时候又往往是相同的,这时通常可以使用可选参数。在C#以前实现可变参数的功能,往往声明一个包含所有可能参数的方法,其他方法调用这个方法,并传递恰当的默认值。

在可选参数中,设计一个方法的参数时,可以为部分或全部参数分配默认值。在调用这些方法代码可以选择不指定部分实参,接受默认值。还可以在调用方法时,还可以通过指定参数名称的方式为其传递实参。如下实例:

static void OptionalParameters(int x, int y = 10, int z = 20) { Console.WriteLine("x={0} y={1} z={2}",x,y,z); }     

OptionalParameters(1, 2, 3); OptionalParameters(1, 2); OptionalParameters(1);

以上的例子可以很清楚的看到其用法,int y=10和int z=20这两个参数就是可选参数。可选参数的使用中,如果调用时省略了一个参数,C#编译器会自动嵌入参数的默认值。向方法传递实参时,编译器按从左向右的顺序对实参进行求值。使用已命名的参数传递实参时,编译器仍然按照从左到右的顺序对实参进行求值。

      (2).基本原则:

可选参数包含一些规范,具体的一些要求如下:

    (a).所有可选参数必须出现在必备参数之后,参数数组(使用params修饰符声明)除外,但他们必须出现在参数列表的最后,在他们之前是可选参数。

    (b).参数数组不能声明为可选的,如果调用者没有指定值,将使用空数组代替。

    (c).可选参数不能使用ref和out修饰符。

    (d).可选参数可以为任何类型,但对于指定的默认值却有一些限制,那就是默认值必须为常量(数字或字符串字面量、null、const成员、枚举成员、default(T)操作符)。

    (e).指定的值会隐式转换为参数类型,但是这种转换不能是用户定义的。

    (f).可以为方法、构造器、有参属性的参数指定默认值,还可以为属于委托定一部分的参数指定默认值。

    (g).C#不允许省略逗号之间的实参。

在使用可选参数时,对于引用类型使用null来做默认值,如果参数类型是值类型,只需要使用相应的可空值类型作为默认值。

(3).代码示例:  

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wdppsf.html