官网地址:http://msdn.microsoft.com/zh-cn/library/ms182135.aspx

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

参考地址:http://blog.csdn.net/cajon/article/details/394510

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”支持默认参数。

修复:

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

例外:

例程

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

code 代码分析 及其解决方案的更多相关文章

  1. 【DWM1000】 code 解密2一 工程初始化代码分析

    instance_init 函数追下去,绝大多数的代码都在初始化如下结构体 typedef struct { INST_MODE mode; instance_init -ANCHOR //insta ...

  2. hive on spark:return code 30041 Failed to create Spark client for Spark session原因分析及解决方案探寻

    最近在Hive中使用Spark引擎进行执行时(set hive.execution.engine=spark),经常遇到return code 30041的报错,为了深入探究其原因,阅读了官方issu ...

  3. 完整全面的Java资源库(包括构建、操作、代码分析、编译器、数据库、社区等等)

    构建 这里搜集了用来构建应用程序的工具. Apache Maven:Maven使用声明进行构建并进行依赖管理,偏向于使用约定而不是配置进行构建.Maven优于Apache Ant.后者采用了一种过程化 ...

  4. angular代码分析之异常日志设计

    angular代码分析之异常日志设计 错误异常是面向对象开发中的记录提示程序执行问题的一种重要机制,在程序执行发生问题的条件下,异常会在中断程序执行,同时会沿着代码的执行路径一步一步的向上抛出异常,最 ...

  5. 2017-2018-2 20155314《网络对抗技术》Exp4 恶意代码分析

    2017-2018-2 20155314<网络对抗技术>Exp4 恶意代码分析 目录 实验要求 实验内容 实验环境 基础问题回答 预备知识 实验步骤 1 静态分析 1.1 使用virsca ...

  6. SQL查询速度慢的原因分析和解决方案

    SQL查询速度慢的原因分析和解决方案 查询速度慢的原因很多,常见如下几种: 1.没有索引或者没有用到索引(这是查询慢最常见的问题,是程序设计的缺陷) 2.I/O吞吐量小,形成了瓶颈效应. 3.没有创建 ...

  7. C#/.NET基于Topshelf创建Windows服务的守护程序作为服务启动的客户端桌面程序不显示UI界面的问题分析和解决方案

    本文首发于:码友网--一个专注.NET/.NET Core开发的编程爱好者社区. 文章目录 C#/.NET基于Topshelf创建Windows服务的系列文章目录: C#/.NET基于Topshelf ...

  8. .NET Core技术研究-通过Roslyn代码分析技术规范提升代码质量

    随着团队越来越多,越来越大,需求更迭越来越快,每天提交的代码变更由原先的2位数,暴涨到3位数,每天几百次代码Check In,补丁提交,大量的代码审查消耗了大量的资源投入. 如何确保提交代码的质量和提 ...

  9. Android代码分析工具lint学习

    1 lint简介 1.1 概述 lint是随Android SDK自带的一个静态代码分析工具.它用来对Android工程的源文件进行检查,找出在正确性.安全.性能.可使用性.可访问性及国际化等方面可能 ...

随机推荐

  1. UNIX时间戳与日期的相互转换

    mysql中UNIX时间戳与日期的相互转换 UNIX时间戳转换为日期用函数:FROM_UNIXTIME() select FROM_UNIXTIME(1410318106); 日期转换为UNIX时间戳 ...

  2. SPRING源码分析:IOC容器

    在Spring中,最基本的IOC容器接口是BeanFactory - 这个接口为具体的IOC容器的实现作了最基本的功能规定 - 不管怎么着,作为IOC容器,这些接口你必须要满足应用程序的最基本要求: ...

  3. OCP-1Z0-051-题目解析-第6题

    6. Examine the structure of the SHIPMENTS table: name                    Null        Type PO_ID      ...

  4. 国内外移动端web适配屏幕方案

    基础知识点 设备像素:设备像素又称物理像素(physical pixel),设备能控制显示的最小单位,我们可以把这些像素看作成显示器上一个个的点. iPhone5的物理像素是640X1136. PS: ...

  5. stm32之通用定时器TIM

    STM32系列的CPU,有多达8个定时器: 1.其中TMI1和TIM8是能够产生三对PWM互补输出的高级定时器,常用于三相电机的驱动:它们的时钟有APB2的输出产生: 2.其它6个为普通定时器,时钟由 ...

  6. 密码算法详解——AES

    0 AES简介 1997年1月2号,美国国家标准技术研究所宣布希望征集一个安全性能更高的加密算法(AES)[3],用以取代DES.我们知道DES的密钥长度是64 bits,但实际加解密中使用的有效长度 ...

  7. C#/.NET笔试题

    1.简述 private. protected. public. internal.protected internal 访问修饰符和访问权限 private : 私有成员, 在类的内部才可以访问. ...

  8. 利用IIS7 解决URL访问限制问题

    网站可以通过URl直接访问一些不希望被访问的东西, 比如一些图片,js,css等等. 为了解决这个问题看了好多文章,不过毕竟我是新手菜鸟级别的,没有具体的解决方法,真心不知道怎么弄. 今天在看IIS的 ...

  9. iOS 之URL schemes

    添加 URL  schemes 步骤: 1.打开info.plist文件. 2.点击 “+ ”号添加,或者在列表上点击鼠标右键,选择 Add Row. 3.选择 URL types. 4.点击三角号展 ...

  10. xyiyy开始写博客了

    拖延症一直到现在才开始写博客... 希望写的博客对大家能有一些帮助,有不恰当或者不对的地方,还望大家指出. 以下为我的两个昵称:fraud xyiyy