Java внутренние классы в c#

У меня есть следующий код 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#?

14
задан devoured elysium 2 March 2010 в 21:42
поделиться

4 ответа

Вам нужно заставить внутренний класс принимать экземпляр внешнего класса в качестве параметра конструктора. (Вот как компилятор Java реализует внутренние классы)

25
ответ дан 1 December 2019 в 06:31
поделиться

Внутренние классы обрабатываются немного по-разному в C# и Java. В Java внутреннему классу неявно передается ссылка на экземпляр внешнего класса, что позволяет внутреннему классу получать доступ к полям внешнего класса. Чтобы получить аналогичную функциональность в C#, нужно просто явно сделать то, что в Java делается неявно.

Посмотрите эту статью для получения дополнительной информации.

15
ответ дан 1 December 2019 в 06:31
поделиться

вот ваш код:

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();
        }
    }
}
2
ответ дан 1 December 2019 в 06:31
поделиться

С точки зрения Java, внутренние классы C # похожи на вложенные классы Java (что вы получите, если объявите общедоступный статический класс B в вашем коде).

Причина разницы в том, что C # поддерживает делегаты, которые заменяют основной вариант использования внутренних классов Java. Как только делегаты находятся на языке, разработчики C # посчитали ненужным добавлять различие между внутренними и вложенными классами.

4
ответ дан 1 December 2019 в 06:31
поделиться