2009-10-17 84 views
15

我将Java转换为C#并具有以下代码(请参阅有关其使用的discussion in Java Context)。一种方法可能是创建一个单独的文件/类,但有没有一个C#idom保留了Java代码中的意图?C#是否具有相当于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) { 
    // ... 
      } 
     } 
    } 

回答

3

这给看看 http://blogs.msdn.com/oldnewthing/archive/2006/08/01/685248.aspx

我在

换句话说寻找具体而言,Java的内部类是 语法糖不可用 到C#。在C#中,您必须手动执行 。

如果你愿意,你可以创建自己的 糖:

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

如果你想在Java中 写入新o.InnerClass(......),你可以在 C#或者是O写。 NewInnerClass(...)或新的 InnerClass(o,...)。是的,这只不过是一个新词的移动而已。像我说的,它只是糖。

+0

该博客非常有用,并且显示该构造会导致一些难看的语法。 – 2009-10-17 11:22:29

+9

Java的静态嵌套类仅用于范围机制。 Java的静态嵌套类直接转换为C#的:class Foo {class Group {}}。这是不正确的答案,选择@JonSkeet回答 – 2012-05-13 14:55:47

67

所有 C#嵌套类是像Java静态内部类:

C#:

class Outer 
{ 
    class Inner 
    { 
    } 
} 

是像Java的:

class Outer 
{ 
    static class Inner 
    { 
    } 
} 

换句话说,实例Inner没有是对Outer实例的隐式引用。

还有不是相当于C#中的一个Java 内部类。

虽然两种语言的可访问性规则有所不同:在C#中,嵌套类中的代码可以访问包含类中的私有成员;在Java中,这是相反的。

+1

我想你的意思是所有*非静态* C#嵌套类就像Java静态嵌套类? – Mishax 2013-05-02 05:28:30

+0

@Mishax:那么,C#中的静态类在Java中没有相同的内容,无论它们是顶级还是嵌套。 – 2013-05-02 05:42:16

+1

这是真的!我的观点是你在回答中强调了“全部”,我认为“所有C#嵌套类都像Java静态嵌套类”这样的陈述是错误的 – Mishax 2013-05-02 06:25:48

0

根据Nested Classes,您可以在C#中拥有一个静态嵌套类。

相关问题