C#静态函数,以此作为Java函数的参数

时间:2013-05-29 15:24:24

标签: c# java

我有一个需要重写为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)

或者我还需要做其他事吗?

感谢您的帮助

4 个答案:

答案 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);