Внутренние классы Java в c # - PullRequest
14 голосов
/ 03 марта 2010

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

Ответы [ 4 ]

25 голосов
/ 03 марта 2010

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

15 голосов
/ 03 марта 2010

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

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

4 голосов
/ 03 марта 2010

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

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

1 голос
/ 03 марта 2010

вот ваш код:

var_b должен быть внутренним, который находится между private и public и означает что-то вроде «доступно для классов пространства имен»:

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();
        }
    }
}
...