我在c#中使用custom serializer以使用字典序列化/反序列化对象。但是在反序列化期间,字典对象未正确设置。见代码:
public DictionarySerializer<String, Point> jointDictionary
{
get { return _jointDictionary; }
set { _jointDictionary = jointDictionary; }
}
返回的jointDictionary对象是空的,但是在调试器线程中我注意到了一个包含字典内容的“value”对象。将我的代码更改为以下问题解决了我的问题:
public DictionarySerializer<String, Point> jointDictionary
{
get { return _jointDictionary; }
set { _jointDictionary = value; }
}
我已阅读有关“value”关键字的信息,并了解它是C#中的保留字,用于指定客户端尝试用于设置对象的值。所以我的问题是,为什么联合数据库引用不会像我第一次尝试那样工作? value关键字的正确用法是什么?
答案 0 :(得分:10)
关键字value
表示传递给属性的值。您应该始终在属性设置器中使用它。
如果您使用jointDictionary
,则绑定到属性getter。这使得
set { _jointDictionary = jointDictionary; }
编译到
set { _jointDictionary = this.jointDictionary; }
因为这会访问属性getter,所以它真的变成了
set { _jointDictionary = _jointDictionary; }
答案 1 :(得分:1)
第一个实现是递归的。
_jointDictionary
设置为jointDictionary
,调用getter,返回尚未设置的_jointDictionary
。
因此,结果是空白的。
就像你做的那样:
_jointDictionary = _jointDictionary;
value
关键字允许您访问传递给setter的值,这就是您想要的。
答案 2 :(得分:1)
此代码:
public DictionarySerializer<String, Point> jointDictionary
{
get { return _jointDictionary; }
set { _jointDictionary = jointDictionary; }
}
调用set
时是否执行以下操作:
jointDictionary
通过get
get
返回_jointDictionary
_jointDictionary
设置为返回的内容因此,set
方法无效,_jointDictionary
将保留其开头的值(在本例中为null
)。
答案 3 :(得分:0)
如果它确实有效,那将是不合逻辑的,因为你将“基本上”创建一个循环情况,你试图将变量分配给你试图分配的变量的值。
简而言之,'外国人'。
答案 4 :(得分:0)
您的第一次尝试是错误的,因为在设置该属性之前引用该属性本身会返回该属性的值。
所以:
set { _jointDictionary = jointDictionary; }
你确实做到了:
_jointDictionary = _jointDictionary;
因为:
get { return _jointDictionary; }
答案 5 :(得分:0)
如果将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是在属性声明中预先声明的,因此它避免了冗余信息。
除非您需要私有类变量(用于验证或通知),否则只有更简单的语法:
DictionarySerializer<String, Point> JointDictionary { get; set; }
在这种情况下,编译器会自动生成私有成员以及getter和setter的代码。