我有以下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#编程时通常会如何实现类似的效果?
答案 0 :(得分:25)
您需要使内部类将外部类的实例作为构造函数参数。 (这是Java编译器实现内部类的方法)
答案 1 :(得分:15)
C#和Java之间的内部类处理略有不同。 Java隐式地将对外部类的实例的引用传递给内部类,允许内部类访问外部类的字段。要在C#中获得类似的功能,您只需要明确地隐式执行Java所做的事情。
查看this article以获取更多信息。
答案 2 :(得分:4)
从Java的角度来看,C#内部类就像java嵌套类(如果在代码中声明public static class B
,你得到的内容)。
区别的原因是C#支持委托,它取代了Java内部类的主要用例。一旦代理人使用该语言,C#的设计者就觉得不必在内部类和嵌套类之间添加区别。
答案 3 :(得分:1)
这是你的代码:
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();
}
}
}