2009-10-17 10 views
15

Je convertis Java en C# et ai le code suivant (voir discussion in Java Context sur son utilisation). Une approche pourrait être de créer un fichier/classe séparé mais y a-t-il un id C# qui préserve l'intention dans le code Java?C# a-t-il un équivalent de classe imbriquée statique 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) { 
    // ... 
      } 
     } 
    } 

Répondre

3

Donnez un coup d'oeil ce http://blogs.msdn.com/oldnewthing/archive/2006/08/01/685248.aspx

Je cherche spécifiquement à

En d'autres termes, Java classes internes sont sucre syntaxique qui ne sont pas disponibles à C#. En C#, vous devez le faire manuellement .

Si vous le souhaitez, vous pouvez créer votre propre sucre:

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

Si vous voulez écrire en Java nouvelle o.InnerClass (...) vous pouvez écrire dans C# soit o. NewInnerClass (...) ou nouveau InnerClass (o, ...). Oui, c'est juste un tas de bouger le mot nouveau autour. Comme je l'ai dit, c'est juste du sucre.

+0

Le blog est utile et montre que la construction peut conduire à une syntaxe laide. –

+9

La classe imbriquée statique de Java est juste pour le mécanisme de portée. La classe imbriquée statique de Java se traduit directement en C#: 'class Foo {class Group {}}'. Ce n'est pas la bonne réponse, choisissez @JonSkeet réponse –

67

Toutes les C classes # imbriquées sont comme des classes imbriquées Java statiques:

C#:

class Outer 
{ 
    class Inner 
    { 
    } 
} 

est comme de Java:

class Outer 
{ 
    static class Inner 
    { 
    } 
} 

En d'autres termes, une instance de Innern'a pas une référence implicite à une instance de Outer.

Il n'est pas l'équivalent d'une classe interne Java en C# bien.

Les règles d'accessibilité sont quelque peu différentes entre les deux langues: en C#, le code de la classe imbriquée a accès aux membres privés dans la classe conteneur; en Java, c'est l'inverse.

+1

Je pense que vous voulez dire que toutes les classes imbriquées * non statiques * C# sont comme des classes imbriquées statiques Java? – Mishax

+0

@Mishax: Eh bien, les classes statiques en C# n'ont pas d'équivalent en Java, qu'elles soient de niveau supérieur ou imbriquées. –

+1

C'est vrai! Mon point est que vous avez souligné le "Tout" dans votre réponse et je pense que l'instruction "Toutes les classes imbriquées C# sont comme les classes imbriquées statiques Java" est faux – Mishax

0

Vous pouvez avoir une classe statique imbriquée en C#, conformément à Nested Classes.