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

时间:2013-10-11 05:30:35

标签: c# .net 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());
    }
}

这就是它的召唤方式:

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

是否可以更新外面的私人会员?

5 个答案:

答案 0 :(得分:6)

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

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

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

答案 1 :(得分:6)

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

正确的思考方式是数据不是私有的。 名称是私有的。如果您选择以某种方式在类之外共享数据,那就不会破坏封装。实际上私有的是名称 _myClassMember,它只引用类中代码中的字段。

Interface behavior is dfferent in VB.Net

了解更多详情。

答案 2 :(得分:2)

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

以下链接解释了引用类型和值类型之间的区别:

Click here

以下是您可以采取哪些措施来阻止修改:

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());
    }
}

答案 3 :(得分:0)

我认为这是不正确的。私有成员的概念是您不能以

之类的方式直接访问它
cls._myClassMember.Add("Item1");

但是因为你打电话

cls.GetClassMembers();

它返回类的成员,然后你可以对它进行修改。

答案 4 :(得分:0)

是的,这完全合法。如果你想要可以访问类之外的私有变量,你通常会使用一个属性(get / set):

private List<string> _myClassMember = null;

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

如果您希望其他人能够添加/删除项目但不实际将新列表(或null)分配给set,请删除该属性的_myClassMember部分。