我发誓我曾经看过一个例子,但是找了一段时间并没有找到。
我有一个包含对象引用的类,需要为其编写GET方法。我的问题是,我不希望任何人都能够做出更改,即我希望他们获得只读版本的对象(请注意,我需要能够从我的类内部进行更改)。
谢谢
我发誓我曾经看过一个例子,但是找了一段时间并没有找到。
我有一个包含对象引用的类,需要为其编写GET方法。我的问题是,我不希望任何人都能够做出更改,即我希望他们获得只读版本的对象(请注意,我需要能够从我的类内部进行更改)。
谢谢
不,没有办法做到这一点。例如,如果您返回一个List<string>
(并且它不是不可变的),那么调用者将能够添加条目。
解决此问题的常规方法是返回一个不可变的包装器,例如ReadOnlyCollection<T>
。
对于其他可变类型,您可能需要在返回之前克隆该值。
请注意,仅返回不可变接口视图(例如返回IEnumerable<T>
而不是List<T>
)无法阻止调用者将其强制转换回可变类型并进行变异。
编辑:请注意,除此之外,这种关注点是不可变类型使代码更易于推理的原因之一 :)
返回一个精简接口的引用:
interface IFoo
string Bar { get; }
class ClassWithGet
public IFoo GetFoo(...);
private
或internal
实现的IFoo,这样它就无法被强制转换回来 ;) - jerryjvlclass A {
public string strField = 'string';
public int intField = 10;
}
class AWrapper {
private A _aObj;
public AWrapper(A aobj) {
_aObj = A;
}
public string strField {
get {
return _aObj.strField;
}
}
public int intField {
get {
return _aObj.intField;
}
}
}
这是不可能的。对于引用类型,获取和设置访问器会获取并设置对象的引用。您可以使用私有(或内部)setter来防止引用的更改,但是如果通过getter公开了对象本身,则无法防止对象本身的更改。
您的问题看起来是在寻找以下信息:
public PropertyName { get; private set; }
然而,考虑到迄今为止的答案,我不确定我是否正确解释了你的问题。此外,我又有什么资格质疑Jon Skeet呢? :)
我同意 ReadOnlyCollection。
看看我的简单代码:
private List<Device> _devices;
public readonly System.Collections.ObjectModel.ReadOnlyCollection<Device> Devices
{
get
{
return (_devices.AsReadOnly());
}
}
ReadOnlyCollection 没有 Add 方法,因此用户无法向其中添加属性。但是不能保证用户无法通过调用其方法修改对象...
我以某种方式遇到了这个问题。我有一个CategoryViewModel类,其中有一个我想要私有只读的属性Category:
public CategoryViewModel
{
private Category { get; }
}
public void ApplyAction(ICategoryRepository repo, Action<ICategoryRepository, Category> action)
{
action(repo, Category);
}
就像这样,从其他地方,我可以做这样的事情:
categoryViewModel.ApplyAction(_repository, (r, c) => r.MarkForInsertOrUpdate(c));
这可以帮助其他人仅在某些情况下暴露其属性并对其进行管理。