在 C# 中声明属性

Posted

技术标签:

【中文标题】在 C# 中声明属性【英文标题】:Declare Property in C# 【发布时间】:2014-05-17 19:24:07 【问题描述】:

什么时候应该使用:

public string User  get; set; 

什么时候:

private string _user;
public string User

     get  return _user; 
     set  _user = value; 

以及何时:

public string User;

例如,我有 Class 包含 user 属性。 我应该如何决定应该使用我写的哪一个选项?

【问题讨论】:

你的第一个例子无效。 我编辑了,只是写错了。现在有效 【参考方案1】:

作为一般经验法则,只有当您需要在 getter 或 setter 中执行其他操作时,您才应该真正使用带有支持字段的属性 - 验证某些输入、更改其他状态或引发属性更改通知,例如:

private string _user;
public string User

    get  return _user; 
    set
    
        _user = value;
        this.RaisePropertyChanged(x => x.User);
    

否则,您可以只使用自动属性:

public string User  get; set; 

您不需要支持 _user 字段。

就个人而言,我会避免在类中使用公共变量。

【讨论】:

"您不需要支持 _user 字段。" - - > 这只是书写错误。而且我没有理解这一行:` this.RaisePropertyChanged(x => x.User);` 很好,我是这么认为的。不要太担心RaisePropertyChanged 行,它只是一些可以(并且经常)出现在setter 中的代码示例。它引发了 XAML 绑定侦听的 PropertyChanged 事件,这在 MVVM 模式中很重要。【参考方案2】:

没有一般规则,如果您在一个团队中,这可能取决于您的团队商定的约定。根据经验,使用 setter 和 getter 可以让您更好地控制可以对属性执行的操作,例如验证输入、格式化输出、引发事件、决定可以私下设置/只读属性,等等

【讨论】:

【参考方案3】:

1st (autoproperty) 基本上是做 2nd 的简写形式。 至于用法,它有助于验证输入、引发事件等,例如

private string _user;
public string User

    get  return _user; 
    set
     
        if(!(value == ""))
            _user = value; 
    

在任何情况下,建议使用 getter 和 setter。

【讨论】:

以上是关于在 C# 中声明属性的主要内容,如果未能解决你的问题,请参考以下文章

C#:一个属性用于多个声明 (DLLImport)

C#中静态字段声明时赋值与构造函数中赋值

C#字段属性的特性

如何在 C# 1.1 中动态声明和处理列表列表

C#“动态”无法访问在另一个程序集中声明的匿名类型的属性

C# 嵌套对象属性