Ответ 1
Вам нужно сделать внутренний класс, чтобы принять экземпляр внешнего класса в качестве параметра конструктора. (Так компилятор Java реализует внутренние классы)
У меня есть следующий код 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. Теперь я попытался настроить аналогичный код в С#, но, похоже, сделать то же самое невозможно. Если это так, как вы обычно достигаете аналогичного эффекта при программировании в С#?
Вам нужно сделать внутренний класс, чтобы принять экземпляр внешнего класса в качестве параметра конструктора. (Так компилятор Java реализует внутренние классы)
Внутренние классы обрабатываются несколько иначе между С# и Java. Java неявно передает ссылку на экземпляр внешнего класса на внутренний класс, позволяя внутреннему классу получать доступ к полям внешнего класса. Чтобы получить аналогичную функциональность в С#, вам просто нужно явно указать, что Java делает неявно.
За дополнительной информацией обращайтесь к этой статье.
С точки зрения Java внутренние классы С# похожи на вложенные классы Java (что вы получаете, если объявляете public static class B
в своем коде).
Причина разницы в том, что С# поддерживает делегатов, что заменяет основной вариант использования для внутренних классов 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();
}
}
}