2013-05-29 50 views
1

我得到了一個需要重寫爲java的C#項目。不幸的是,原來的程序員無法聯繫到,我在項目中遇到了一些C#特定問題。C#靜態函數以此作爲Java函數的參數

比方說我們有像在C#中的一類:

public static class MySampleClass : Object 
{ 
    ... 
    public static IEnumerable<MyObject> MyFunc(this MyObject t) { 
    //a lot of code 
    } 
    ... 
} 

我不,這個函數的參數之前瞭解。它指的是什麼?我的意思是我們在一個靜態類和一個靜態函數,所以什麼是「這個」?那只是參考t呢?

,當然還有我的問題是,這一功能標題是Java的替代品這樣的:

public static Iterable<MyObject> MyFunc(MyObject t) 

或者我需要做什麼嗎?

謝謝您的幫助

+0

和用於java比較:http://stackoverflow.com/questions/4359979/java-equivalent-to-c-sharp-extension-methods –

回答

3

在這種情況下thisMyObject任何實例。這就是所謂的extension method

擴展方法使你的方法「添加」到現有各類 而無需創建一個新的派生型,重新編譯,或以其他方式 修改原始類型。擴展方法是一種特殊的靜態方法,但它們被調用,就好像它們是擴展類型的實例方法 。

它定義了一個方法,可用於類的實例MyObject。 Java中沒有這樣的東西,所以你必須在MyObject類中添加這個方法。

+0

所以基本上我不必做任何事情授予該函數不實際引用「這「作爲對象在任何方式是正確的? – user2001951

+0

那麼你可以刪除'this'並且它可以工作,但是不必'myInstance.MyMethod',你必須執行'MyClass.MyMethod(myInstance)'。 – Zbigniew

+0

你也可以將'MyMethod'移動到'MyClass',所以你不必傳遞'myInstance'參數。 – Zbigniew

0

擴展方法,就像在他的回答中指出的walkhard,可以在任何地方聲明,並且可以簡單地調用,就好像它們已經在類中聲明一樣。

這在Java中不存在。您將不得不將MyFunc添加到該Java類的聲明中。

0

以這種方式使用this使該方法成爲extension method。 Java沒有相同的東西。在C#中,它是語法糖,讓你做同樣的事情,因爲這:

MySampleClass.MyFunc(myObject); 

有了這個代碼:

myObject.MyFunc(); 

(這些編譯爲同樣的事情,只要是MySampleClass的命名空間導入並MyObject沒有聲明自己的MyFunc()方法。)

因爲這並不在Java中存在,您應該簡單地與MySampleClass.MyFunc(myObject)取代myObject.MyFunc()

0

這是一個擴展方法它允許型MyObject來的任何對象,以暴露方法MYFUNC,並用它作爲一個正常的實例方法(但在現實中它不是)它是一個普通的類方法

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

這是一個在java中不存在的語法糖,因此如果不想更改對MyFunc的所有調用或編寫靜態函數並修改對MyObject.MyFunc(o)的每次調用,則必須修改類MyObject並添加實例方法MyFunc。 ;