0

クラスのプライベートメンバーを外部で変更できる状況に遭遇しました。これが私のクラスです:

public class MyClass
{
    private List<string> _myClassMember = null;

    public MyClass()
    {
        _myClassMember = new List<string>();
    }

    public List<string> GetClassMembers()
    {
        return _myClassMember;
    }

    public void PrintMembers()
    {
        Console.WriteLine("No of items in member {0}", _myClassMember.Count.ToString());
    }
}

これは、次のように呼ばれています。

class Program
{
    static void Main(string[] args)
    {
        MyClass cls = new MyClass();
        cls.PrintMembers();
        IList<string> lst = cls.GetClassMembers();
        lst.Add("Item1");
        lst.Add("Item2");
        cls.PrintMembers();
    }
}

次のように印刷されます。

No of items in member 0
No of items in member 2

外部のプライベートメンバーを更新できるのは正しいですか?

4

5 に答える 5

6

最近、この質問が出されたのはこれで 2 回目です。

これについて考える正しい方法は、データはプライベートなものではないということです。名前は私的なものです何らかの形でクラス外でデータを共有することを選択した場合、それはカプセル化を壊していません。実際にプライベートなのはname で、これは_myClassMemberクラス内にあるコード内のフィールドのみを参照します。

見る

VB.Net ではインターフェイスの動作が異なります

詳細については。

于 2013-10-11T06:18:21.373 に答える
2

これは、C# で予期される動作です。リストは参照型と呼ばれるものです。つまり、関数からリストを返すと、実際にはクラス内のオブジェクトへの参照が返されます。これにより、それを変更できます。

参照型と値型の違いを説明するリンクは次のとおりです。

ここをクリック

変更を防ぐためにできることの例を次に示します。

public class MyClass
{
    private List<string> _myClassMember = null;

    public MyClass()
    {
        _myClassMember = new List<string>();
    }

    public IReadOnlyList<string> GetClassMembers()
    {
        return _myClassMember.AsReadOnly();
    }

    public void PrintMembers()
    {
        Console.WriteLine("No of items in member {0}", _myClassMember.Count.ToString());
    }
}
于 2013-10-11T05:35:35.540 に答える
0

正しくないと思います。プライベート メンバーの概念は、次のような方法で直接アクセスできないことです。

cls._myClassMember.Add("Item1");

でも電話してるから

cls.GetClassMembers();

クラスのメンバーを返し、それを変更できます。

于 2013-10-11T05:38:33.223 に答える
0

はい、これは完全に合法です。クラス外のプライベート変数にアクセスしたい場合は、通常、プロパティ (get/set) を使用します。

private List<string> _myClassMember = null;

public List<string> MyClassMember
{
    get { return _myClassMember; }
    set { _myClassMember = value; }
}

set他のユーザーがアイテムを追加/削除できるようにするが、実際には新しいリスト (または null) を に割り当てないようにする場合は、プロパティの一部を削除し_myClassMemberます。

于 2013-10-11T05:42:37.700 に答える