V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
huzhikuizainali
V2EX  ›  C#

C#中有什么专有名词来定义 方法.方法 这种调用方式么?

  •  
  •   huzhikuizainali · 2023-11-19 09:41:44 +08:00 · 1521 次点击
    这是一个创建于 398 天前的主题,其中的信息可能已经有所发展或是发生改变。
    C#中可以用:
    对象名.方法
    类名.方法
    this.方法

    请看下面这段代码,GetManager 是方法,IsValid 也是方法。这种当然 GetManager 会返回一个对象。最终导致 GetManager().IsValid(fileName) 事实上是 对象名.方法 的调用。但是 GetManager().IsValid(fileName)形式上还是 方法.方法 调用方式 。
    我的问题是:方法.方法 的这种语法有什么“专有名词”来定义这种语法么?我想根据“专有名词”去查一下这个语法的使用限制等相关知识。

    public class LogAnalyzerUsingFactoryMethod
    {
    public bool IsValidLogFileName(string fileName)
    {
    return GetManager().IsValid(fileName);
    }
    protected virtual IExtensionManager GetManager()
    {
    return new FileExtensionManager();
    }
    }
    thisrabbit
        1
    thisrabbit  
       2023-11-19 10:19:35 +08:00   ❤️ 1
    链式调用? Method Chaining
    https://en.wikipedia.org/wiki/Method_chaining
    nulIptr
        2
    nulIptr  
       2023-11-19 14:21:38 +08:00
    我很奇怪为啥 lz 要构造这么个概念。楼上贴的 wiki 里面也说了,链式调用只是语法糖。在 c#中所有的 method 都是在 class 中的,到 il 层都是 call/calli/callvirt ,有构造这些的概念功夫不如看看 il 里面的 call/calli/callvirt 有啥区别。
    huzhikuizainali
        3
    huzhikuizainali  
    OP
       2023-11-19 15:59:59 +08:00
    @thisrabbit 谢谢回复
    我搜了一下链式调用。看到的例子是 对象.方法.方法 这种形式。但是上面代码是:方法.方法 的形式。所以我不确定是不是链式调用?
    还有我在 https://learn.microsoft.com/zh-cn/docs/ 这里搜索链式调用,Method Chaining 。也搜不到什么有用信息。是不是搜索方法有问题?
    thisrabbit
        4
    thisrabbit  
       2023-11-19 21:28:23 +08:00
    @huzhikuizainali “方法.方法” 其实只是表象,本质是“[返回值为对象的方法]().[被上一个方法返回的对象所拥有的方法]()”,这样来看还是你说的“对象.方法.方法”,这种应该确实就是链式调用了,你可以先看看 OOP 语言 Java 里链式调用的用法,不是任何方法都可以链起来,前提必须是上一个方法的返回值是一个新的对象或用 this 返回当前对象。

    其次的话虽然当前问题只局限在 C#里,但还是想建议 OP 在表述“方法.方法”时严谨一些,一定要带上 call 的括号(),因为在 Python ,JS 等动态语言里,你可以往一个函数内挂载别的 property ,比如有一个 function foo() {},那么可以 foo.bar=function() {},这样子 foo 既可以被 call 也可以被当作对象做属性索引 foo.bar ,这种时候 foo().bar()和 foo.bar()实际上是完全不同的两种调用了。
    thisrabbit
        5
    thisrabbit  
       2023-11-19 21:51:41 +08:00
    @huzhikuizainali 重新看了一下你的问题,如果你是想问为什么 isValidLogFileName 可以直接引用同 class 下的 GetManager 而不用像其他语言一样 this.GetManager 的话,可能这是一个 C#的语法糖,见 https://stackoverflow.com/a/16227273

    此外如果问题还是在链式调用的话,你也可以看一下 FluentAPI 相关的内容,这个概念基本上也是利用了链式调用来提供一种更简洁的调用方式。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2569 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 11:57 · PVG 19:57 · LAX 03:57 · JFK 06:57
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.