C# c语言中的Java内部类#

C# c语言中的Java内部类#,c#,java,inner-classes,C#,Java,Inner Classes,我有以下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

我有以下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#编程时通常如何实现类似效果?

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

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

查看更多信息

以下是您的代码:

var_b需要是内部的,介于private和public之间,意思是“可访问命名空间类”:

从Java的角度来看,C#内部类类似于Java嵌套类(如果在代码中声明
公共静态类B
,就会得到这些类)


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

在C语言中肯定可以有内部类。您能否显示用于转换为C#的代码或收到的任何错误?这也可能有帮助:@NG:No,C#没有内部类。嵌套类的行为与内部类明显不同。
var_a
不需要是
internal
。当您使用策略或状态模式分解类时,缺少Java风格的内部类实际上会带来很大的痛苦。请注意,在Java中这样做主要是因为类往往变得很大,由于成员变量太多,职责太多,人们希望在内部类中对功能进行分组,而不会过多地拆分外部类。所以基本上你只想把它用于阅读目的。例如,将类似函数分组在一起,而不将一个类拆分为多个类。这可以通过C#区域轻松实现。@TonniTielens:No;主要是传递一个绑定到父类(例如,事件处理程序)的接口实现。C#使用委托代替。
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();
        }
    }
}