2009-10-17 6 views
15

Konwertuję Javę na język C# i otrzymuję następujący kod (patrz: discussion in Java Context). Jednym ze sposobów może być stworzenie osobnego pliku/klasy, ale czy istnieje C# idom, który zachowuje intencję w kodzie Java?Czy w języku C# występuje odpowiednik zagnieżdżonej klasy statycznej Java?

public class Foo { 

    // Foo fields and functions 
    // ... 
     private static class SGroup { 
      private static Map<Integer, SGroup> idMap = new HashMap<Integer, SGroup>(); 

      public SGroup(int id, String type) { 
    // ... 
      } 
     } 
    } 

Odpowiedz

3

dać to wyglądać http://blogs.msdn.com/oldnewthing/archive/2006/08/01/685248.aspx

szukam konkretnie

Innymi słowy, Java klasy wewnętrzne są cukier syntaktyczny, który nie jest dostępny do C#. W języku C# należy to zrobić ręcznie: .

Jeśli chcesz, możesz stworzyć własny cukru:

class OuterClass { 
... 
InnerClass NewInnerClass() { 
    return new InnerClass(this); 
} 
void SomeFunction() { 
    InnerClass i = this.NewInnerClass(); 
    i.GetOuterString(); 
} 
} 

Gdzie chcesz napisać w Javie nowy o.InnerClass (...) można napisać w C# albo o. NewInnerClass (...) lub nowa InnerClass (o, ...). Tak, to tylko jeden z ruchów nowego słowa. Tak jak powiedziałem, to tylko cukier.

+0

Blog jest przydatny i pokazuje, że konstrukcja może prowadzić do brzydkiej składni. –

+9

Zagnieżdżona klasa statyczna Java służy tylko do mechanizmu określania zakresu. Jawna klasa zagnieżdżona Java tłumaczy bezpośrednio do C#: 'class Foo {class Group {}}'. To nie jest poprawna odpowiedź, wybierz @JonSkeet odpowiedź –

67

Wszystkie # zagnieżdżone klasy C są jak Java statyczne zagnieżdżonych klas:

C#:

class Outer 
{ 
    class Inner 
    { 
    } 
} 

Czy jak Java:

class Outer 
{ 
    static class Inner 
    { 
    } 
} 

Innymi słowy, instancję Innernie ma niejawne odwołanie do instancji Outer.

Nie jest to nie jest toodpowiednik klasy 32 Java wewnątrz klasy.

Zasady dostępności różnią się nieco między tymi dwoma językami: w języku C# kod w klasie zagnieżdżonej ma dostęp do prywatnych elementów w klasie zawierającej; w Javie jest odwrotnie.

+1

Myślę, że masz na myśli wszystkie * niestatyczne * zagnieżdżone klasy C# są jak statyczne zagnieżdżone klasy Java? – Mishax

+0

@Mishax: No cóż, klasy statyczne w języku C# nie mają odpowiednika w Javie, bez względu na to, czy są one najwyższego poziomu, czy zagnieżdżone. –

+1

To prawda! Chodzi mi o to, że w odpowiedzi zaznaczyłeś "Wszyscy" i myślę, że stwierdzenie "Wszystkie klasy zagnieżdżone w C# są jak statyczne klasy zagnieżdżone w Javie" jest fałszywe – Mishax

0

Możesz mieć statyczną klasę zagnieżdżoną w języku C#, zgodnie z Nested Classes.