【问题标题】:Java Equivalent code in C#C# 中的 Java 等效代码
【发布时间】:2014-02-03 22:18:18
【问题描述】:

我正在尝试为以下 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# 中查找委托,它们是这种语言的必经之路。

标签: c# java porting difference


【解决方案1】:

C# 中没有匿名类(在您需要的意义上)。如果要返回TokenStream 的自定义实现的实例,则需要定义它并为其命名。

例如:

public MyTokenStream {
    public Token nextToken() {
        // ...
    }
}

public TokenStream plumb() {
    return new MyTokenStream();
}

见:

供参考。

正如 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

【讨论】:

  • 其实有 (return new { Prop1 = 1, Prop2 = 2}) 但是“匿名”在 C# 和 Java 中有非常不同的含义。 C# 中的这种声明可以通过委托来完成,或者(更好)尊重原始意图,使用 私有类和基类类型的字段
  • @Konrad 感谢您的详细回答。我现在的问题是 nextToken 方法使用外部类中定义的变量和方法。这是如何在 C# 中实现的?
  • 没问题 - 匿名方法可以看到它们,毕竟它是在类中创建的。如果它不止是一条线,只需用大括号(return () =&gt; { something; something; return new TokenStream();} 将其主体包裹起来,我在示例中使用的缩短符号是一种语法糖。如果您仍然遇到问题,请编辑您的答案并发布实际代码,这可能是解决问题的最快方法
  • 你好。我无法让我的代码运行。我无法访问外部方法和变量。我有一个名为 XLexer 的类,它是自动生成的,但我可以添加自定义代码(这是我试图添加我之前提到的代码的地方)。这个 XLexer 类实现了 TokenStream 类,并有一个名为 mString() 的方法 - 这是自动生成的。因此,当我尝试实现消息中提到的自定义代码时,我收到一条错误消息,指出 mString() 只有在静态时才能访问。任何提示 @KonradMorawski?
  • @pinker 取决于你的意图,我猜你要么需要在你的匿名 TokenStream 实例上实现 mString,要么像这样前缀 mStringXLexer.this.mString
【解决方案2】:

改用委托。这里有一个例子:http://msdn.microsoft.com/en-us/library/0yw3tz5k.aspx

【讨论】:

    【解决方案3】:

    不确定这是否是您想要的结果。

    但我看到的方式是你只想返回一个 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();
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-10-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-11-23
      • 1970-01-01
      相关资源
      最近更新 更多