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

172 天前
 huzhikuizainali
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();
}
}
729 次点击
所在节点    C#
5 条回复
thisrabbit
172 天前
链式调用? Method Chaining
https://en.wikipedia.org/wiki/Method_chaining
nulIptr
172 天前
我很奇怪为啥 lz 要构造这么个概念。楼上贴的 wiki 里面也说了,链式调用只是语法糖。在 c#中所有的 method 都是在 class 中的,到 il 层都是 call/calli/callvirt ,有构造这些的概念功夫不如看看 il 里面的 call/calli/callvirt 有啥区别。
huzhikuizainali
172 天前
@thisrabbit 谢谢回复
我搜了一下链式调用。看到的例子是 对象.方法.方法 这种形式。但是上面代码是:方法.方法 的形式。所以我不确定是不是链式调用?
还有我在 https://learn.microsoft.com/zh-cn/docs/ 这里搜索链式调用,Method Chaining 。也搜不到什么有用信息。是不是搜索方法有问题?
thisrabbit
172 天前
@huzhikuizainali “方法.方法” 其实只是表象,本质是“[返回值为对象的方法]().[被上一个方法返回的对象所拥有的方法]()”,这样来看还是你说的“对象.方法.方法”,这种应该确实就是链式调用了,你可以先看看 OOP 语言 Java 里链式调用的用法,不是任何方法都可以链起来,前提必须是上一个方法的返回值是一个新的对象或用 this 返回当前对象。

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

此外如果问题还是在链式调用的话,你也可以看一下 FluentAPI 相关的内容,这个概念基本上也是利用了链式调用来提供一种更简洁的调用方式。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/993166

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX