能修改课外的私人会员吗?

Raj*_*ian 0 .net c# oop

我遇到了这样的情况,我可以在外面修改班级的私人成员.这是我的班级:

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());
    }
}
Run Code Online (Sandbox Code Playgroud)

这是它的调用方式:

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();
    }
}
Run Code Online (Sandbox Code Playgroud)

它打印如下:

No of items in member 0
No of items in member 2
Run Code Online (Sandbox Code Playgroud)

能够更新外面的私人会员是否正确?

Dav*_*rno 6

是.它只是私人的参考.如果您分享该引用.然后外部代码可以自由修改其内容.

如果您不希望外部代码修改内容,则使用不可变集合类.

虽然您可以修改myClassMember引用的列表的内容,但是您不能从类外部执行的操作是更改myClassMember指向的列表.


Eri*_*ert 6

这是最近这个问题第二次出现.

考虑这一点的正确方法是数据不是私有的.这个名字是私有的.如果你选择以某种方式在类之外共享数据,那就不会破坏封装.那其实是事情私有的是 _myClassMember,这只是指领域代码是类里面.

看到

接口行为在VB.Net中是不同的

更多细节.