首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >CallerMemberName是如何从内部工作的?

CallerMemberName是如何从内部工作的?
EN

Stack Overflow用户
提问于 2020-07-28 00:00:11
回答 1查看 287关注 0票数 0

我找不到任何文档,或者至少找不到像这样的属性是如何从内部工作的解释。

代码语言:javascript
复制
    [CallerMemberName] 
    [CallerFilePath] 
    [CallerLineNumber]

Documentation I found只展示了如何使用它。

是否可以创建您自己的CallerMemberNameAttribute实现或一些自定义CallerObjectAttribute

这对我来说很有趣,只是为了学习和理解背后的代码。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-07-28 01:23:02

所以只是为了学习的目的。属性本身对方法本身没有任何影响,但对方法的调用方式有影响。

如果编译器必须创建对该方法的调用,它将检查每个参数,如果它具有这些属性之一,如果有,则将调用者的名称或文件作为参数值传递。它会用其他默认值覆盖默认值。将默认参数放在那里的要求只是为了让编译器允许您在第一时间省略此参数。

假设你有这样的代码:

代码语言:javascript
复制
   static void Main(string[] args)
    {
        Test();
        Test1();
    }

    public static void Test(string name = "")
    {
        Console.WriteLine(name);
    }

    public static void Test1([CallerMemberName] string name = "")
    {
        Console.WriteLine(name);
    }

生成的代码与

代码语言:javascript
复制
  static void Main(string[] args)
    {
        Test("");
        Test1("Main");
    }

除非您修改编译器本身,否则您不能用您的编程来模拟这一点。如果调用者的编译器找到这个属性,它就会把这个"Main“字符串(或者当前编译的文件名)放入其中。

如果显式传递该参数的值,则将忽略这两个参数、默认值和CallerMemberName属性。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63119035

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档