我正在尝试为以下Java代码编写一些等效的C#代码:
public class XLexer extends antlr.CharScanner implements TokenStream {
protected int stringCtorState = 0;
public String mString() { return ""; }
public Token nextToken() {
resetText(); // exists in CharScanner class
return null; // will return something
}
public TokenStream plumb() {
return new TokenStream() {
public Token nextToken() {
resetText(); // exists in CharScanner class
if (stringCtorState >= 0) { String x = mString(); }
return null; // will return something
}
};
}
}
谁能给我一个提示,用C#怎么做,因为在return语句中定义nextToken方法时出现错误。
谢谢!
最佳答案
C#中没有匿名类(在您需要的意义上)。如果要返回TokenStream
的自定义实现的实例,则需要对其进行定义并为其命名。
例如。:
public MyTokenStream {
public Token nextToken() {
// ...
}
}
public TokenStream plumb() {
return new MyTokenStream();
}
看到:
http://docs.oracle.com/javase/tutorial/java/javaOO/anonymousclasses.html
http://www.25hoursaday.com/CsharpVsJava.html(“希望在这里”部分列出了匿名内部类;“此部分描述了Java中存在的语言功能和概念,没有C#对应语言”)。
以供参考。
正如kan所言,在C#(以及Java 8)中,通常将使用委托或lambda代替。
如果TokenStream所做的全部是返回nextToken,则可以这样实现:
public class TokenStream
{
}
public class SomeClass
{
public Func<TokenStream> Plumb()
{
// I'm returning a function that returns a new TokenStream for whoever calls it
return () => new TokenStream();
}
}
static void Main(string[] args)
{
var someClass = new SomeClass();
TokenStream stream = someClass.Plumb()(); // note double brackets
}
考虑一下JavaScript中的一流函数,如果有助于解决问题的话。
新的Java带来了功能接口,类似于:http://java.dzone.com/articles/introduction-functional-1