因此,我需要遍历代码库,并删除所有公共设置器,并将其更改为不可变属性的私有设置。
我知道这将使我更难以设置值,而我可以通过构造函数来做到这一点。除了通过构造函数,我还有其他方法可以设置值吗?
重点是限制更改值的访问权限。
答案 0 :(得分:1)
private string _value;
public SetValue(string value)
{
_value = value;
}
或
ctrl + 。属性以封装字段
答案 1 :(得分:1)
当我还需要在构造函数之外设置该属性时,可以使用多种方法在C#中创建不可变属性。
第一种情况是如果在设置对象后修改了对象,则会引发异常
private object _myProperty;
public object MyProperty
{
public get { return _myProperty; }
public set
{
if(_myProperty == null) { _myProperty = value; }
else { throw new InvalidOperationException("MyProperty can't be changed onece set"); }
}
}
此方法不能在运行前防止错误,但可以帮助您在做傻事时抓紧自己。
另一种方法是使用界面隐藏设置器。通过显式实现接口,您可以向用户隐藏属性或方法,除非他们将类强制转换为该特定接口。这实际上并不能使您的属性不变,但是可以帮助保护属性免遭意外修改。
public interface MyInterface
{
object MyProperty { get; }
}
public interface MyInterfaceProtected
{
object MyProperty { set; }
}
public class MyClass : MyInterFace, MyInterfaceProtected
{
private object _myProperty;
public object MyProperty { get {return _myProperty;} }
object MyInterfaceProtected.MyProperty
{
set { _myProperty = value; }
}
}
答案 2 :(得分:0)
似乎您在谈论C#6 { get; }
。这些属性只能从构造函数设置。
如果将属性定义为{ get; private set; }
,则可以从此类或派生类中进行设置。