我遇到了能够修改课外私人成员的情况。这是我的班级:
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
是否可以更新外面的私人会员?
答案 0 :(得分:6)
是。它只是私人参考。如果您分享该引用。然后外部代码可以自由修改其内容。
如果您不希望外部代码修改内容,请使用不可变集合类。
虽然您可以修改myClassMember引用的列表的内容,但是您不能从类外部执行的操作是更改myClassMember指向的列表。
答案 1 :(得分:6)
这是这个问题最近第二次出现。
正确的思考方式是数据不是私有的。 名称是私有的。如果您选择以某种方式在类之外共享数据,那就不会破坏封装。实际上私有的是名称 _myClassMember
,它只引用类中代码中的字段。
见
Interface behavior is dfferent in VB.Net
了解更多详情。
答案 2 :(得分: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());
}
}
答案 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
部分。