c# - 为什么 C# 调用方信息属性需要默认值?

标签 c# c#-5.0 callermembername

我刚刚看到 C# 5 调用者信息属性 ( http://msdn.microsoft.com/en-us/library/hh534540.aspx )。

这似乎是一个非常有用的功能,我已经阅读了一些文档 ( http://www.codeproject.com/Tips/606379/Caller-Info-Attributes-in-Csharp )。

但是,我只是想知道:为什么必须传入默认值?它们是如何使用的?

以下示例代码显示了如何使用调用者信息属性:

public static void ShowCallerInfo([CallerMemberName] 
  string callerName = null, [CallerFilePath] string 
  callerFilePath = null, [CallerLineNumber] int callerLine=-1)
{
    Console.WriteLine("Caller Name: {0}", callerName);
    Console.WriteLine("Caller FilePath: {0}", callerFilePath);
    Console.WriteLine("Caller Line number: {0}", callerLine);
}

我的问题是:nullnull-1 的默认值有什么用?上面的代码与以下代码有何不同:

public static void ShowCallerInfo([CallerMemberName] 
  string callerName = "hello", [CallerFilePath] string 
  callerFilePath = "world", [CallerLineNumber] int callerLine=-42)
{
    Console.WriteLine("Caller Name: {0}", callerName);
    Console.WriteLine("Caller FilePath: {0}", callerFilePath);
    Console.WriteLine("Caller Line number: {0}", callerLine);
}

按照我的理解,这些是可选参数,编译器提供默认值,替换我们分配的任何默认值。在那种情况下,我们为什么要指定默认值?是否存在一些奇怪的边缘情况,编译器可能无法填充值,并求助于我们提供的默认值?如果不是,那为什么要求我们输入这些数据?要求开发人员提供永远不会被使用的默认值似乎相当笨拙。

免责声明:我尝试用谷歌搜索这个,但我找不到任何东西。我几乎不敢就 SO 提出问题,因为大多数这样的新手问题都会遇到这样的敌意,但作为最后的手段,我会冒险提出一个问题。版主/高级用户,无意冒犯 - 我确实在发布之前尝试在其他地方查找信息。

最佳答案

这些参数需要一个默认值,因为 Caller Info 属性是使用可选参数实现的,而可选参数需要一个默认值。这样调用就可以是简单的 ShowCallerInfo() 而无需发送任何参数,编译器将添加相关参数。

为什么一开始就使用可选参数来实现它是一个更深层次的问题。他们可以没有,并且编译器需要在实际编译开始之前“注入(inject)”这些参数,但与可选参数(这是一个 C# 4.0 特性)它不会向后兼容并且会破坏其他编译器/代码分析工具

关于c# - 为什么 C# 调用方信息属性需要默认值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24358016/

相关文章:

c# - 如何在 C# 中使用 params 关键字和调用者信息?

c# - 将选定的行从数据 GridView 传输到另一个数据 GridView

c# - 向 C# 命名空间添加描述

c# - 无法将类型 'ulong[]' 隐式转换为 'Newtonsoft.Json.Linq.JToken'

c# - 从连接体中寻找关节

asynchronous - 如何在 target.net 4.0 项目中使用异步关键字

c# - 使用 C# 5.0 异步读取文件

.net - 为什么类型推断逻辑在对 TreeNodeCollection 进行迭代时会失败?

c# - 使用 nameof 运算符而不是 CallerMemberNameAttribute 来通知 .NET 4.5.3 中的属性更改有什么好处吗?