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

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

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

虽然您可以修改 myClassMember 引用的列表的内容,但您不能从类外部更改 myClassMember 指向的列表。

于 2013-10-11T05:36:34.797 回答
6

这是最近第二次提出这个问题。

思考这个问题的正确方法是数据不是私有的。名字是私有的东西如果您选择以某种方式在课堂外共享数据,那并没有破坏封装。真正私有的东西是name _myClassMember它只指代码中类内部的字段。

VB.Net 中的接口行为不同

更多细节。

于 2013-10-11T06:18:21.373 回答
2

这是 C# 中的预期行为。List 是所谓的引用类型,这意味着当您从函数返回它时,实际上是在返回对类中对象的引用。这允许您对其进行修改。

这是一个解释引用类型和值类型之间区别的链接:

点击这里

以下是您可以采取哪些措施来防止修改的示例:

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 回答