C# C语言中的Java等价代码#

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

我正在尝试为以下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#中没有匿名类(在您需要的意义上)。如果要返回
令牌流
的自定义实现的实例,需要对其进行定义并为其命名

例如:

见:

  • (匿名内部类列在“希望你在这里”一节中;“这一节描述了Java中存在的没有C语言对应物的语言特性和概念”)

供参考

正如kan所说,在C#(以及java8)中,您通常会使用委托或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
    }
公共类令牌流
{
}
公共类
{            
公共功能铅锤()
{
//我返回一个函数,该函数为调用它的人返回一个新的令牌流
return()=>newtokenstream();
}
}
静态void Main(字符串[]参数)
{
var someClass=new someClass();
TokenStream=someClass.Plumb();//注意双括号
}
想想JavaScript中的一流函数,如果它有助于实现它的话


新的Java带来了类似的功能接口:

C#中没有匿名类(在您需要的意义上)。如果要返回
令牌流
的自定义实现的实例,需要对其进行定义并为其命名

例如:

见:

  • (匿名内部类列在“希望你在这里”一节中;“这一节描述了Java中存在的没有C语言对应物的语言特性和概念”)

供参考

正如kan所说,在C#(以及java8)中,您通常会使用委托或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
    }
公共类令牌流
{
}
公共类
{            
公共功能铅锤()
{
//我返回一个函数,该函数为调用它的人返回一个新的令牌流
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#中是如何实现的?没问题-匿名方法可以看到它们,它毕竟是在类中创建的