何时在C#中使用Value关键字

时间:2012-01-23 22:31:42

标签: c#

我在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关键字的正确用法是什么?

6 个答案:

答案 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时是否执行以下操作:

  1. jointDictionary通过get
  2. 阅读
  3. get返回_jointDictionary
  4. _jointDictionary设置为返回的内容
  5. 因此,set方法无效,_jointDictionary将保留其开头的值(在本例中为null)。

答案 3 :(得分:0)

如果它确实有效,那将是不合逻辑的,因为你将“基本上”创建一个循环情况,你试图将变量分配给你试图分配的变量的值。

简而言之,'外国人'。

答案 4 :(得分:0)

您的第一次尝试是错误的,因为在设置该属性之前引用该属性本身会返回该属性的值。

所以:

set { _jointDictionary = jointDictionary; }

你确实做到了:

_jointDictionary = _jointDictionary;

因为:

get { return _jointDictionary; }

答案 5 :(得分:0)

如果将getset方法视为任何其他功能,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的代码。