0

重複の可能性:
C# は、同じ包含クラス内にあるときに、クラス自体の外部にあるプライベート変数へのアクセスを許可するのはなぜですか?

どうやら以下のコードは合法であり、さらに驚くべきことに、フレームワーク2以降は合法です...

public class Magic
{
    private readonly int _anInt;
    private readonly string _aString;

    public Magic(int anInt, string aString)
    {
        _anInt = anInt;
        _aString = aString;
    }

    public Magic(Magic toCopy)
    {
        _anInt = toCopy._anInt; // Legal!
        _aString = toCopy._aString; // Legal!
    }

    public void DoesntWorkMagic(Magic toCopy)
    {
        _anInt = toCopy._anInt; // edit: Will work if not readonly. 
        _aString = toCopy._aString;
    }

    public int AnInt { get { return _anInt; } }

    public string AString { get { return _aString; } }
}

どうしたの?私は何年にもわたって非常に多くのコピー コンストラクターが余分な作業を行っているのを見てきました。その使用に関する注意事項はありますか (明らかなスレッド化の問題以外に)?

4

2 に答える 2

3

プライベートはオブジェクトレベルではなく、クラスレベルであるため、同じクラスのオブジェクトはプライベートな側面を認識しているため、同じクラスの他のオブジェクトのプライベートなものを変更できます。

private は、他のタイプが行ってはいけない場所を突っつくのを防ぎます。

于 2013-01-25T11:21:33.190 に答える
0

C# には「コピー コンストラクター」はありません。コンストラクターしかありません。

コードには、現在のクラス Magic のインスタンスである引数 toCopy があります。したがって、同じクラスであるため、プライベート フィールドtoCopy._anIntに アクセスできますtoCopy._aString(フィールドを同じクラスのすべてのインスタンスから見えるようにする修飾子です)。

_anIntまた、コンストラクターにいるので、_aString新しいインスタンスのフィールドを設定できます。

キーワードは、readonly「このフィールドは、インスタンスのコンストラクターでのみ設定できます。

于 2013-01-25T11:21:01.760 に答える