16

我有以下 Java 代码:

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# 编程时如何实现类似的效果?

4

4 回答 4

26

您需要使内部类将外部类的实例作为构造函数参数。(这就是 Java 编译器实现内部类的方式)

于 2010-03-02T21:45:20.987 回答
15

C# 和 Java 对内部类的处理略有不同。Java 隐式地将外部类实例的引用传递给内部类,允许内部类访问外部类的字段。要在 C# 中获得类似的功能,您只需要显式地执行 Java 隐式执行的操作。

查看这篇文章了解更多信息。

于 2010-03-02T21:47:44.733 回答
5

从 Java 的角度来看,C# 内部类就像 java 嵌套类(如果public static class B在代码中声明,就会得到什么)。

差异的原因是 C# 支持委托,它取代了 Java 内部类的主要用例。一旦委托使用该语言,C# 的设计者就觉得没有必要在内部类和嵌套类之间添加区别。

于 2010-03-02T21:54:15.317 回答
2

这是你的代码:

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();
        }
    }
}
于 2010-03-02T21:53:24.693 回答