C# C语言中的Java等价代码#
我正在尝试为以下Java代码编写一些等效的C代码:C# C语言中的Java等价代码#,c#,java,porting,difference,C#,Java,Porting,Difference,我正在尝试为以下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 clas
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#中没有匿名类(在您需要的意义上)。如果要返回
令牌流
的自定义实现的实例,需要对其进行定义并为其命名
例如:
见:
- (匿名内部类列在“希望你在这里”一节中;“这一节描述了Java中存在的没有C语言对应物的语言特性和概念”)
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
}
公共类令牌流
{
}
公共类
{
公共功能铅锤()
{
//我返回一个函数,该函数为调用它的人返回一个新的令牌流
return()=>newtokenstream();
}
}
静态void Main(字符串[]参数)
{
var someClass=new someClass();
TokenStream=someClass.Plumb();//注意双括号
}
想想JavaScript中的一流函数,如果它有助于实现它的话
新的Java带来了类似的功能接口:C#中没有匿名类(在您需要的意义上)。如果要返回
令牌流
的自定义实现的实例,需要对其进行定义并为其命名
例如:
见:
- (匿名内部类列在“希望你在这里”一节中;“这一节描述了Java中存在的没有C语言对应物的语言特性和概念”)
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
}
公共类令牌流
{
}
公共类
{
公共功能铅锤()
{
//我返回一个函数,该函数为调用它的人返回一个新的令牌流
return()=>newtokenstream();
}
}
静态void Main(字符串[]参数)
{
var someClass=new someClass();
TokenStream=someClass.Plumb();//注意双括号
}
想想JavaScript中的一流函数,如果它有助于实现它的话
新Java带来了类似的功能接口:改用委托。这里有一个例子:改用委托。这里有一个例子:不确定这是否是您想要的结果 但在我看来,您只想返回一个
TokenStream
对象,该对象具有nextToken
方法,该方法返回一个对象Token
public class TokenStream
{
public Token nextToken()
{
return new Token();
}
}
这将是您的TokenStream
类,然后您可以在其他地方拥有一个方法/函数,该方法/函数执行以下操作
public TokenStream plumb()
{
return new TokenStream();
}
它的用法是
TokenStream ts = plumb();
Token t = ts.nextToken();
不确定这是否是您想要的结果 但在我看来,您只想返回一个
TokenStream
对象,该对象具有nextToken
方法,该方法返回一个对象Token
public class TokenStream
{
public Token nextToken()
{
return new Token();
}
}
这将是您的TokenStream
类,然后您可以在其他地方拥有一个方法/函数,该方法/函数执行以下操作
public TokenStream plumb()
{
return new TokenStream();
}
它的用法是
TokenStream ts = plumb();
Token t = ts.nextToken();
C#中的查找委托,它们是这种语言中的方法。C#中的查找委托,它们是这种语言中的方法。实际上有(返回新的{Prop1=1,Prop2=2}),但“匿名”在C#和Java中有非常不同的含义。C#中的这种声明可以通过委托完成,或者(更好的)使用私有类和基类类型的字段来尊重原始意图。@Konrad感谢您的详细回答。我现在的问题是nextToken方法使用外部类中定义的变量和方法。这是如何在C#中实现的?没问题-匿名方法可以看到它们,它毕竟是在类中创建的。如果它不止是一行,只需用花括号(
return()=>{something;something;returnnew-TokenStream();
})将其主体包裹起来即可,我在示例中使用的缩写符号是一种语法糖。如果仍然有问题,请编辑答案并发布实际代码,这可能是再次解决问题的最快方法。我无法运行代码。我无法访问外部方法和变量。我有一个名为XLexer的类自动生成,但我可以添加自定义代码(这是我尝试添加前面提到的代码的地方)。此XLexer类实现了类TokenStream,并有一个名为mString()的方法-这是自动生成的。因此,当我尝试实现消息中提到的自定义代码时,我收到一个错误消息,称mString()只有在静态时才能访问..任何提示@KonradMorawski?@pinker取决于您的意图,我想您要么需要在匿名TokenStream
实例上实现mString
,要么像这样前缀mString
:XLexer.this.mString
实际上有(返回新的{Prop1=1,Prop2=2}),但是“匿名”在C#和Java中的含义截然不同。C#中的这种声明可以通过委托或(更好)完成尊重私有类和基类类型字段的原始意图。@Konrad感谢您的详细回答。我现在的问题是nextToken方法使用外部类中定义的变量和方法。这在C#中是如何实现的?没问题-匿名方法可以看到它们,它毕竟是在类中创建的