c# - C#为什么字典允许属性设置虽然属性是内部设置
问题描述
我正在使用流利的验证 API 来编写验证。
我在课堂上遇到了一处internal set
房产ValidationContext
。
public class ValidationContext {
public Dictionary<string, object> RootContextData { get; internal set; } = new Dictionary<string, object>();
}
我在这个问题中遇到了内部设置属性。所以,我可以像这样设置字典的值
var rowItemContext = new ValidationContext();
rowItemContext.RootContextData.Add("ab", new object());//this works
上面的代码将一个项目添加到RootcontextData
作品中。
但是以下将另一个字典直接分配给 RootContextData 的行会导致编译时错误。
无法将属性或索引器“ValidationContext.RootContextData”分配给——它是只读的
rowItemContext.RootContextData = new Dictionary<string, object>()
{
{ "ab", new object() }
};
因此,要将项目字典添加到上下文数据中,我必须遍历要添加的字典。我很惊讶为什么第一个有效但不是直接分配。
解决方案
您似乎对什么是“设置”属性感到困惑。
通常,您仅set
在使用该=
标志时才对物业进行标记。当您使用赋值运算符时,您实际上是在为属性赋予一个新值。
Dictionary
是引用类型,因此该属性存储对字典对象的引用。在这种情况下,属性的值是指向字典的引用。
当您调用 时Add
,您只是在修改字典对象,而不是属性的值。该属性的值仍然指向同一个字典对象,因此它保持不变。
当您使用=
并创建新字典时,您试图将存储在属性中的引用更改为其他引用。这算作set
财产,所以你不能这样做。
推荐阅读
- excel - 从日期范围内的某月某日的相邻单元格获取美元值
- javascript - 如何从 JavaScript 对象内部访问属于同一对象的属性?
- react-native - 有没有办法在 expo react native 中使用线性加速?
- jupyter-notebook - 我下载了pycharm专业版,但是还是不能使用jupyter notebook。页面看起来还是社区版
- python - ntplib PermissionError: [Errno 1] 不允许操作
- sql - 如果在 where 子句中使用相同的列,如何设置 column=null?[SQL]
- c - 有符号范围等式
- php - 通过 Outlook 发送电子邮件后 PHP 函数()返回不起作用
- raspberry-pi - 使用 Netbeans 12 for Raspberry PI 设置远程开发
- java - 如何使用导航底部菜单存储片段的状态