2010-03-02 14 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