【问题标题】:OptionalAttribute parameter's default value?OptionalAttribute 参数的默认值?
【发布时间】:2011-03-25 21:05:09
【问题描述】:

MSDN 的 VS2010 Named and Optional Arguments (C# Programming Guide) 告诉我们 C# 中的可选参数,显示的代码如我所料:

public void ExampleMethod(int required, 
    string optionalstr = "default string", 
    int optionalint = 10)

好的,但它也说:

您也可以声明可选 使用 .NET 参数 可选属性类。 OptionalAttribute 参数不 需要一个默认值。

我阅读了MSDN's OptionalAttribute page,并在网上进行了搜索(这表明很多人声称 OptionalAttribute 参数不能被 C# 使用——我猜这些 cmets 是在 C# 4 之前制作的?),但我不能找到两个问题的答案:

如果我使用 OptionalAttribute 将 C# 参数定义为可选:

  1. 如果我调用该方法但未指定该参数的值,将使用什么值?
  2. 会在编译时或运行时评估该值吗?

【问题讨论】:

  • 在调试中运行它并检查它的值。我会怀疑 null。
  • 好吧,我怀疑 default(T) 是 null 或零。

标签: c# default-value optional-parameters


【解决方案1】:

规则是这样的:

请注意,对于除object 类型的参数之外的所有内容,它等价于default(T)

我有点惊讶,因为C# 4.0 specification 没有说明结果会是什么,我希望它会在那里。

另外(如indicated by Scott Rippey in the comments),这是在编译时评估的,这不是运行时操作,这意味着如果您在已部署的其他程序集中调用此方法,并且您更改了可选值,传递给方法的默认值将不会更改,除非您编译所有对程序集中的方法进行调用的东西。

【讨论】:

  • 您还应该提到这是在编译时评估的。编译器实际上是在编译时将默认值插入到调用代码中。
  • 我认为值得一提的是,当通过反射调用方法时,您传入Type.Missing,并且适当的值将插入到被调用的方法中运行时间。所以它可以在运行时和编译时完成。 (参考:Type.Missing
猜你喜欢
  • 2012-08-01
  • 2018-06-20
  • 1970-01-01
  • 2012-05-04
  • 1970-01-01
  • 1970-01-01
  • 2011-02-20
  • 2011-10-28
  • 2011-04-09
相关资源
最近更新 更多