1

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

4 回答 4

3

在这种情况下this,指的是MyObject. 它被称为扩展方法

扩展方法使您能够将方法“添加”到现有类型,而无需创建新的派生类型、重新编译或以其他方式修改原始类型。扩展方法是一种特殊的静态方法,但它们被称为扩展类型的实例方法。

它定义了一个可用于MyObject类实例的方法。Java中没有这样的东西,所以你必须将这个方法添加到MyObject类中。

于 2013-05-29T15:25:39.410 回答
0

扩展方法,就像 walkhard 在他的回答中指出的那样,可以在任何地方声明,并且可以像在类中声明它们一样简单地调用。

这在 Java 中不存在。您必须添加MyFunc到该 Java 类的声明中。

于 2013-05-29T15:27:40.987 回答
0

this这种方式使用使该方法成为扩展方法。Java 没有等价物。在 C# 中,它是语法糖,可让您执行与此相同的操作:

MySampleClass.MyFunc(myObject);

使用此代码:

myObject.MyFunc();

(只要MySampleClass' 的命名空间被导入并且MyObject不声明自己的MyFunc()方法,这些编译成相同的东西。)

由于这在 Java 中不存在,您应该简单地替换myObject.MyFunc()MySampleClass.MyFunc(myObject).

于 2013-05-29T15:33:04.537 回答
0

它是一种扩展方法,它允许 MyObject 类型的任何对象公开 MyFunc 方法并将其用作普通的实例方法(但实际上它不是)它是普通的类方法

MyObject o=new MyObject();
//whitout extension method
MyObject.MyFunc(o);
//with extension
o.MyFunc();

它是 java 中不存在的语法糖,因此如果您不想更改对 MyFunc 的所有调用或编写静态函数并修改对 MyObject.MyFunc 的每个调用,则必须修改类 MyObject 并添加实例方法 MyFunc( o);

于 2013-05-29T15:33:08.313 回答