3

我是 Java 新手,但从事 C# 工作多年。所以我打算将一段用 Java 编写的代码翻译成 C#。一切都很好,但我遇到了一个似乎很奇怪的代码。这是代码:

//Java Version
public class ParentClass{

    ArrayList<SomeType> values;
    void MyFunction(){ /*some codes*/ }
    //other codes    

    public class NestedClass {

        public void handleMessage(SomeType val) {           
            values.add(val);                 //This cannot be done in C#
            MyFunction();                    //This cannot be done in C#
        }
    }
}

毫不奇怪,在 C# 中我无法访问values(这是 a List<SomeType>)和MyFunction. 为什么这在 Java 中是可能的,如何在 C# 中获得等效代码?

4

3 回答 3

4

Java中有几种内部(嵌套)类:

  1. 静态内部类
  2. 非静态内部类
  3. 函数局部内部类
  4. 匿名内部类

这些类的不同之处在于它们可以在其外部类中访问哪些成员。

C#只有一种类,对应于Java列表中的#1。您的代码拥有的是#2,一个非静态内部类。这些类的实例对其外部类具有隐式引用,解释了它们访问外部类成员的方式。作为具有此隐式引用的交换,非静态内部类只能在外部类的对象的上下文中实例化。

要在 C# 中对非静态内部类进行建模,可以添加一个构造函数,该构造函数采用外部类的实例,并将所有对外部类成员的直接引用替换为由引用您在构造函数中设置的外部类的变量限定的引用.

于 2013-10-23T11:30:20.203 回答
1

要在 C# 中从内部类访问外部类的成员,您需要在构造函数中将外部类传递给内部

public class ParentClass{
    public class NestedClass {

        private ParentClass parent;

        public NestedClass(ParentClass parent){
            this.parent = parent;
        }
    }
}

在 Java 中这是不需要的,因为内部类(非静态嵌套类)只能存在于外部类的实例中,通过这种方式访问​​外部类的成员。这意味着在 Java 中,您需要首先实例化外部类,然后创建与其关联的内部对象

ParentClass outer = new ParentClass();
outer.NestedClass = outer.new NestedClass();
于 2013-10-23T11:31:54.007 回答
1

C# 中的解决方法有点尴尬:

public class ParentClass
{
    internal List<SomeType> values;
    internal virtual void MyFunction()
    {
    }

    public class NestedClass
    {
        private readonly ParentClass outerInstance;

        public NestedClass(ParentClass outerInstance)
        {
            this.outerInstance = outerInstance;
        }

        public virtual void handleMessage(SomeType val)
        {
            outerInstance.values.Add(val);
            outerInstance.MyFunction(); 
        }
    }
}
于 2013-10-23T13:43:52.637 回答