何时在 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 引用不能像我第一次尝试时那样工作?价值关键字的正确用法是什么?

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

关键字 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时执行以下操作:

  1. jointDictionary通过get读取
  2. get返回_jointDictionary
  3. _jointDictionary设置为返回的内容

因此,set方法实际上什么都不做,_jointDictionary将保留它开头的值(在本例中为 null (。

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

简而言之,"外星人"。

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

所以通过:

set { _jointDictionary = jointDictionary; }

你实际上做到了:

_jointDictionary = _jointDictionary;

以:

get { return _jointDictionary; }

如果您认为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 是在属性声明中预先声明的,因此它避免了冗余信息。

除非你需要私有类变量(用于验证或通知(,否则有一个更简单的语法 JUST:

DictionarySerializer<String, Point> JointDictionary { get; set; }

在这种情况下,编译器将自动生成私有成员以及 getter 和 setter 的代码。