分享
 
 
 

[FxCop.设计规则]11. 不应该使用默认参数

王朝other·作者佚名  2006-01-31
窄屏简体版  字體: |||超大  

11. 不应该使用默认参数翻译概述:在MSDN中对于调用使用默认参数的函数的说明如下:

.NET Framework 开发员指南

访问默认参数值

某些语言(如 C++ 托管扩展和 Microsoft Visual Basic .NET)支持将默认值赋给参数。例如,以下示例是一个合法的 Visual Basic .NET 声明,此声明将默认值赋给两个参数。

[Visual Basic]

Public Sub MyMethod (a as Integer, _

Optional b as Double = 1.2, _

Optional c as Integer=1)

您可以使用参数属性来分配默认的参数值。

通过确切指定哪些参数是默认值或略去尾部的默认参数,可以声明参数的默认值。例如,以下所有示例都是对 MyMethod 的有效调用。

[Visual Basic]

MyMethod(10, 55.3, 12)

MyMethod(10, 1.3) ' c == 1

MyMethod(11) ' b == 1.2, c == 1

[C#]

MyMethod (10, 55.3, 12);

MyMethod (10, 1.3); // c == 1

MyMethod (11); // b == 1.2, c == 1

要使用反射检索参数的默认值,请获取该参数的 ParameterInfo 对象,然后使用 ParameterInfo.DefaultValue 属性检索默认值。如果不存在默认值,该属性将返回 Value.DBNull

以下示例向控制台显示 MyMethod 的默认值。

[Visual Basic]

Dim m As MethodInfo = t.GetMethod("MyMethod")

Dim ps As ParameterInfo() = m.GetParameters()

Dim i As Integer

For i = 0 To ps.Length - 1

Console.WriteLine("Default Value == {0}", ps(i).DefaultValue)

Next i

[C#]

MethodInfo m = t.GetMethod ("MyMethod");

ParameterInfo[] ps = m.GetParameters();

for (int i = 0; i < ps.Length; i++) {

Console.WriteLine("Default Value == {0}", ps[i].DefaultValue);

}

要调用包含具有默认值的参数的方法,请使用 Type.Missing 作为 InvokeMember 方法的参数值。这样,晚期绑定服务就能够为指定的参数值使用默认值。如果为不带默认值的参数传递 Type.Missing,则将引发 ArgumentException。有一点务必要注意,并非所有编译器的绑定机制都会遵守 Type.Missing 的这些规则。有些联编程序可能不支持此功能,或者可能以不同的方式来处理 Type.Missing。当使用 Type.Missing 时,默认值不必是结尾的参数值。

C# 语言不支持默认参数。

以下 Visual Basic .NET 示例显示如何调用具有默认参数的方法。

[Visual Basic]

Option Strict Off

Imports System

Imports System.Reflection

Public Class OptionalArg

Public Sub MyMethod (a As Integer, Optional b As Double = 1.2, Optional c As Integer=1)

Console.WriteLine("a = " & a & " b = " & b & " c = " & c)

End Sub

End Class

Module Module1

Sub Main

()

Dim o As New OptionalArg

Dim t As Type

t = GetType(OptionalArg)

Dim Param As Object()= {10, 20, 30}

t.InvokeMember("MyMethod", _

BindingFlags.Public Or _

BindingFlags.Instance Or _

BindingFlags.InvokeMethod Or _

BindingFlags.OptionalParamBinding, _

Nothing, _

o, _

New Object() {10, 55.3, 12})

t.InvokeMember("MyMethod", _

BindingFlags.Public Or _

BindingFlags.Instance Or _

BindingFlags.InvokeMethod Or _

BindingFlags.OptionalParamBinding, _

Nothing, _

o, _

New Object() {10, 1.3, Type.Missing})

t.InvokeMember("MyMethod", _

BindingFlags.Public Or _

BindingFlags.Instance Or _

BindingFlags.InvokeMethod Or _

BindingFlags.OptionalParamBinding, _

Nothing, _

o, _

New Object() {10, Type.Missing, Type.Missing})

End Sub

End Module

当使用上述方法时,即使调用方未指定任何值,仍会考虑尾部的默认参数。这是调用具有默认参数的方法时最常用的方式。

如果是使用 MethodBase.Invoke 来调用方法,则需要显式指定哪些参数是默认值,指定的方法是为所有没有值的参数传递一个包含 Type.Missing 的对象数组。

可以看到,如果在不支持默认参数的语言中调用使用默认参数的函数会相当的复杂,因此,虽然在VB.NET和CLS中允许使用默认参数,但是,微软并不推荐用户使用默认参数。在FxCop的设计规则中的第11条实现的对默认参数的检查。

原文引用:Default parameters should not be used

TypeName:

DefaultParametersShouldNotBeUsed

CheckId:

CA1026

Category:

Microsoft.Design

Message Level:

Error

Certainty:

75%

Breaking Change:

Breaking

Cause: An externally visible type contains an externally visible method that uses a default parameter.

Rule Description

Methods that use default parameters are allowed under the Common Language Specification (CLS); however, the CLS allows compilers to ignore the values assigned to these parameters. Code written for compilers that ignore default parameter values must explicitly provide arguments for each default parameter. To maintain the behavior that you want across programming languages, methods that use default parameters should be replaced with method overloads that provide the default parameters.

The C# compiler ignores the values of default parameters as does the Managed C++ compiler when accessing managed code. The Visual Basic compiler supports methods with default parameters using the Optional keyword.

How to Fix Violations

To fix a violation of this rule, replace the method that uses default parameters with method overloads that supply the default parameters.

When to Exclude Messages

Do not exclude a message from this rule.

Example Code

The following example shows a method that uses default parameters, and the overloaded methods that provide an equivalent functionality.

[Visual Basic]

Imports System

<Assembly: CLSCompliant(True)>

Namespace DesignLibrary

Public Class DefaultVersusOverloaded

Sub DefaultParameters(Optional parameter1 As Integer = 1, _

Optional parameter2 As Integer = 5)

' ...

Console.WriteLine("{0} : {1}", parameter1, parameter2)

End Sub

Sub OverloadedMethod()

OverloadedMethod(1, 5)

End Sub

Sub OverloadedMethod(parameter1 As Integer)

OverloadedMethod(parameter1, 5)

End Sub

Sub OverloadedMethod(parameter1 As Integer, parameter2 As Integer)

' ...

Console.WriteLine("{0} : {1}", parameter1, parameter2)

End Sub

End Class

End Namespace

Related Rules

Replace repetitive arguments with params array

See Also

Method Usage Guidelines | Common Language Specification

引起的原因:一个公共的(visible, 想不出怎么翻译,翻译成可见的似乎很拗口。)类型包含一个公共的或保护的(visible)方法,这个方法使用了默认参数。

描述:在公共语言规范(CLS)中允许使用默认参数,它允许编译器不指定值到这些参数。在不支持默认参数的编译器中,就必须明确的为每个参数指定值。如果希望在不同编程语言中可以使用相同的方法调用这个函数,应该使用重载函数替换使用默认参数的函数。

C#编译器不支持默认参数,托管C++编译器在访问托管代码时也不支持默认参数,Visual Basic编译器通过关键字“Optional”支持默认参数。

修复:使用多个重载函数替换使用默认参数的函数。

例外:无

例程原文中的例子中包含两组方法,一个方法使用了默认参数,另外一组方法使用一组重载方法提供了同样的功能。

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有