何时在 C# 中使用 Value 关键字
本文关键字:Value 关键字 何时 | 更新日期: 2023-09-27 18:21:16
我在 c# 中使用自定义序列化程序,以便使用字典序列化/反序列化对象。但是,在反序列化期间,未正确设置字典对象。请参阅代码:
public DictionarySerializer<String, Point> jointDictionary
{
get { return _jointDictionary; }
set { _jointDictionary = jointDictionary; }
}
返回的 jointDictionary 对象为空,但在调试器线程中,我注意到一个包含字典内容的"值"对象。将我的代码更改为以下内容解决了我的问题:
public DictionarySerializer<String, Point> jointDictionary
{
get { return _jointDictionary; }
set { _jointDictionary = value; }
}
我已经阅读了"value"关键字,并了解它是 C# 中的一个保留字,用于指定客户端尝试用于设置对象的值。所以我的问题是,为什么 jointDictionary 引用不能像我第一次尝试时那样工作?价值关键字的正确用法是什么?
关键字 value
表示传递给属性的值。 应始终在属性资源库中使用它。
在您使用jointDictionary
的情况下,您将绑定到属性获取器。 这使得
set { _jointDictionary = jointDictionary; }
编译为
set { _jointDictionary = this.jointDictionary; }
由于这访问了属性获取器,它实际上变成了
set { _jointDictionary = _jointDictionary; }
第一个实现是递归的。
_jointDictionary
设置为 jointDictionary
,这将调用返回尚未设置_jointDictionary
的 getter。
因此,结果为空白。
就好像你做到了:
_jointDictionary = _jointDictionary;
value
关键字允许您访问传递给 setter 的值,这就是您想要的。
此代码:
public DictionarySerializer<String, Point> jointDictionary
{
get { return _jointDictionary; }
set { _jointDictionary = jointDictionary; }
}
调用set
时执行以下操作:
-
jointDictionary
通过get
读取 -
get
返回_jointDictionary
-
_jointDictionary
设置为返回的内容
因此,set
方法实际上什么都不做,_jointDictionary
将保留它开头的值(在本例中为 null
(。
如果它确实有效,那将是不合逻辑的,因为您将"本质上"创建一个循环情况,您尝试将变量分配给您尝试分配的变量的值。
简而言之,"外星人"。
您的第一次尝试是错误的,因为引用其本身中的属性将返回设置属性之前的属性值。
所以通过:
set { _jointDictionary = jointDictionary; }
你实际上做到了:
_jointDictionary = _jointDictionary;
以:
get { return _jointDictionary; }
如果您认为get
和set
方法就像任何其他函数一样,那么value
更有意义。
get { return _jointDictionary; }
set { _jointDictionary = value; }
基本上是 C# 语法糖:
DictionarySerializer<String, Point> get()
{
return _jointDictionary;
}
void set( DictionarySerializer<String, Point> value )
{
_jointDictionary = value;
}
由于 getter 中的返回值类型和 setter 中的值 arg 是在属性声明中预先声明的,因此它避免了冗余信息。
除非你需要私有类变量(用于验证或通知(,否则有一个更简单的语法 JUST:
DictionarySerializer<String, Point> JointDictionary { get; set; }
在这种情况下,编译器将自动生成私有成员以及 getter 和 setter 的代码。