Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/312.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在C#中如何称呼这种语言结构/技术?_C# - Fatal编程技术网

在C#中如何称呼这种语言结构/技术?

在C#中如何称呼这种语言结构/技术?,c#,C#,我正在读别人的C代码,我发现了这行代码: 重新编辑:(缺少精灵对象和一个额外参数) 方法.setColor()不是Foo1类的一部分,它来自另一个类,因此我的问题是如何在方法.move()的末尾调用此方法 Foo1类具有以下声明: public class Foo1 : MonoBehaviour {...} public class ObjectProperties {...} 包含.setColor()方法的类具有以下声明: public class Foo1 : MonoBehavio

我正在读别人的C代码,我发现了这行代码:

重新编辑:(缺少精灵对象和一个额外参数)

方法.setColor()不是Foo1类的一部分,它来自另一个类,因此我的问题是如何在方法.move()的末尾调用此方法

Foo1类具有以下声明:

public class Foo1 : MonoBehaviour {...}
public class ObjectProperties {...}
包含.setColor()方法的类具有以下声明:

public class Foo1 : MonoBehaviour {...}
public class ObjectProperties {...}

这种技巧在C#中常见吗?它是如何调用的?

找出Foo1.move()返回的内容。它应该返回一个具有setColor方法的类,如@Servy所说。

setColor
可能是一个扩展方法,请参见或move()只是返回一个具有
setColor
方法的对象。有时称为流畅界面。

为了回答这个问题(我不应该撤回我的投票!!!这个问题缺乏必要的信息),我假设如下:

public class Foo1{
     Foo1 move(...);
}

public class ObjectProperties{
      static Foo1/void setColor(this Foo1); //magic explained later
}
第二个类的名称表明了这种设置

答复 它被称为,这只是同步糖用于静态辅助方法

扩展方法允许第三方开发人员向其他人开发的类添加方法,而无需使用继承

你聪明的同事找到了一种方法,可以在屏幕上移动一个不是原开发人员编写的
Foo1
。您的同事并没有取悦开发人员将新函数添加到类中(包括所有的IP/专利问题,并且必须等待下一个版本),而是在内部完成了所有这些工作

他写道

public static class ObjectProperties {

      public static [something] setColor(this Foo1 foo, Object rgb){
      }

}
除了要讨论的
这个
修饰符之外,上面的方法是一种合法的静态助手方法,可以在较旧的C#版本、Java和任何其他OO语言中使用。它可以访问Foo的公共成员等等

让C#很酷的是,你可以调用这个方法,就像它是Foo1的一个真正的方法一样,从而用一个新方法扩展类

都是糖,宝贝 别上当了。没有魔法,没有黑客,没有Jon Skeet重构Foo1来源的模糊DLL

编译器只需将您的调用翻译为

ObjectProperties.move(Foo1.move(sprite, new Vector3(1.7f, 1.7f, 1.7f), 5f),myRgb);

没有其他内容

方法.setColor()不是Foo1类的一部分
不会
移动
返回一个
Foo1
,因为除非它返回,否则这是无关的。重要的是,如果
setColor
move
返回的任何类型的方法。我不确定它是否有技术术语,但我会称之为方法链接。它在前一个方法返回的对象上调用一个方法,这是一种非常常见的技术,特别是在LINQ中。它有3个闭合支架,只有2个开口。这个表达式的一部分可能在前一行中,我听过很多人提到这个模式,比如方法链接、方法级联和Fluent接口。它相当受欢迎。是的,这是方法链接。看,例如,它可能是,也可能不是。从语法上讲,扩展方法与普通方法是无法区分的。