我有一个需要重写为java的C#项目。不幸的是,原来的程序员无法联系到,我在项目中遇到了一些特定于C#的问题。
假设我们在C#中有一个类,如:
public static class MySampleClass : Object
{
...
public static IEnumerable<MyObject> MyFunc(this MyObject t) {
//a lot of code
}
...
}
我不理解此函数中参数之前的 this 。它引用了什么?我的意思是我们处于静态类和静态函数中,所以“这个”是什么?它只是对 t 的引用吗?
当然我的问题是这个函数头在Java中替代了这个:
public static Iterable<MyObject> MyFunc(MyObject t)
或者我还需要做其他事吗?
感谢您的帮助
答案 0 :(得分:3)
在这种情况下,this
指的是MyObject
的任何实例。它被称为extension method:
扩展方法使您可以向现有类型“添加”方法 无需创建新的派生类型,重新编译或其他方式 修改原始类型。扩展方法是一种特殊的方法 静态方法,但它们被称为就像它们是实例方法一样 扩展类型。
它定义了一个可以在MyObject
类的实例上使用的方法。 Java中没有这样的东西,所以你必须将这个方法添加到MyObject
类。
答案 1 :(得分:0)
像walkhard在他的回答中指出的扩展方法可以在任何地方声明,并且可以简单地调用,就像它们已经在类中声明一样。
这在Java中不存在。您必须将MyFunc
添加到该Java类的声明中。
答案 2 :(得分:0)
以这种方式使用this
会使该方法成为extension method。 Java没有等价物。在C#中,它是语法糖,可以让你做同样的事情:
MySampleClass.MyFunc(myObject);
使用此代码:
myObject.MyFunc();
(只要MySampleClass
的命名空间被导入,MyObject
没有声明自己的MyFunc()
方法,这些编译为同一个东西。)
由于Java中不存在此问题,因此您只需将myObject.MyFunc()
替换为MySampleClass.MyFunc(myObject)
。
答案 3 :(得分:0)
这是一个扩展方法,它允许MyObject类型的任何对象公开方法MyFunc并将其用作普通实例方法(但实际上并非如此)它是一个普通的类方法
MyObject o=new MyObject();
//whitout extension method
MyObject.MyFunc(o);
//with extension
o.MyFunc();
它是java中不存在的语法糖,因此如果您不想更改对MyFunc的所有调用或编写静态函数并修改对MyObject的每次调用,则必须修改类MyObject并添加实例方法MyFunc .MyFunc(O);