У меня есть следующий код 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 должен быть внутренним, который находится между частным и общедоступным и означает, например, «доступный для классов-пространств имен»:
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();
}
}
}
С точки зрения Java, внутренние классы C # похожи на вложенные классы Java (что вы получите, если объявите общедоступный статический класс B
в вашем коде).
Причина разницы в том, что C # поддерживает делегаты, которые заменяют основной вариант использования внутренних классов Java. Как только делегаты находятся на языке, разработчики C # посчитали ненужным добавлять различие между внутренними и вложенными классами.