2010-03-02 38 views
13

我有以下的Java代码:的Java内部类在C#中

public class A { 
    private int var_a = 666; 

    public A() { 
     B b = new B(); 
     b.method123(); 
     System.out.println(b.var_b); 
    } 

    public class B { 
     private int var_b = 999; 

     public void method123() { 
      System.out.println(A.this.var_a);   
     } 
    } 
} 

其中产量666和999。现在,我已经试图建立在C#中类似的代码,但它似乎是不可能的完成同样的事情。如果是这样的话,你在c#编程时通常会达到类似的效果吗?

+0

你绝对可以在C#中有内部类。您能否显示您用于转换为C#的代码或您收到的任何错误? 这也可能有所帮助:http://blogs.msdn.com/oldnewthing/archive/2006/08/01/685248.aspx – 2010-03-02 21:45:50

+1

@NG:不,C#没有内部类。嵌套类与内部类的行为显着不同。 – 2014-03-30 20:15:36

回答

23

您需要让内部类将外部类的实例作为构造函数参数。 (这是Java编译器实现内部类的方式)

+0

请注意,在Java中,这主要是因为类变得很大,具有太多的成员变量和太多的责任,人们希望在内部类中对功能进行分组,而不会过多地分裂外部类。 所以基本上你只想要这个阅读目的。例如。将类似的功能组合在一起,而不用在多个类中分开一个类。这可以通过C#区域轻松实现。 – 2015-04-30 08:56:06

+2

@TonniTielens:No;它主要完成传递与父类绑定的接口实现(例如事件处理程序)。 C#使用代表。 – SLaks 2015-04-30 14:12:54

15

C#和Java之间的内部类稍有不同。 Java隐式地将对外部类实例的引用传递给内部类,从而允许内部类访问外部类的字段。为了在C#中获得类似的功能,你只需要明确地做Java隐式的工作。

查看this article了解更多信息。

+1

是一个主要的,但误解的差异 – pm100 2010-03-02 21:49:46

1

这里是你的代码:

var_b需要是内部的,这是私人和公共之间和手段,如“命名空间类访问”:

using System; 
using System.Collections.Generic; 
using System.Text; 

namespace ConsoleApplication1 
{ 
    public class A 
    { 
     private int var_a = 666; 

     public A() 
     { 
      B b = new B(this); 
      b.method123(); 
      Console.WriteLine(b.var_b); 
     } 

     public class B 
     { 
      private A a = null; 

      public B(A a) 
      { 
       this.a = a; 
      } 

      internal int var_b = 999; 

      public void method123() 
      { 
       Console.WriteLine(a.var_a); 
      } 
     } 
    } 


    class Program 
    { 

     static void Main(string[] args) 
     { 
      new A(); 
     } 
    } 
} 
+1

'var_a'不需要是'internal'。 – SLaks 2010-03-02 22:01:46

+0

对! (编辑) – 2010-03-02 22:02:53

4

从Java的角度来说,C#内类就像java嵌套类(如果你在你的代码中声明了public static class B)。

不同之处在于C#支持代理,它取代了Java内部类的主要用例。一旦委托人使用该语言,C#的设计人员认为不必在内部类和嵌套类之间添加区分。

+3

当您使用策略或状态模式分解类时,缺乏Java风格的内部类实际上会导致严重的痛苦。 – 2010-03-02 22:04:58