16

次の 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

4 に答える 4

26

内部クラスが外部クラスのインスタンスをコンストラクターパラメーターとして受け取るようにする必要があります。(これは、Javaコンパイラが内部クラスを実装する方法です)

于 2010-03-02T21:45:20.987 に答える
15

内部クラスは、C#とJavaの間でわずかに異なる方法で処理されます。Javaは、外部クラスのインスタンスへの参照を内部クラスに暗黙的に渡し、内部クラスが外部クラスのフィールドにアクセスできるようにします。C#で同様の機能を利用するには、Javaが暗黙的に行うことを明示的に行う必要があります。

詳細については、この記事を確認してください。

于 2010-03-02T21:47:44.733 に答える
5

public static class BJava の観点から見ると、C# の内部クラスは Java のネストされたクラス (コードで宣言した場合に得られるもの) のようなものです。

この違いの理由は、C# がデリゲートをサポートしているためです。デリゲートは、Java 内部クラスの主要なユース ケースを置き換えます。デリゲートが言語に組み込まれると、C# の設計者は、内部クラスと入れ子になったクラスを区別する必要はないと感じました。

于 2010-03-02T21:54:15.317 に答える
2

ここにあなたのコードがあります:

var_b は internal である必要があります。これは 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();
        }
    }
}
于 2010-03-02T21:53:24.693 に答える