3

可能重复:
C# .NET 3.5+ 中属性和字段之间的区别

使用和使用有什么区别

public string Username { get; set; }

并使用

public string Username;

我一直在使用第一个,但想了解两者之间是否有任何区别,以及一个应该优先于另一个的场景。

4

4 回答 4

5
public string Username { get; set; }
  • 是一个属性。

尽管

public string Username;
  • 是一个公共变量。

如需更多对比,

  • 反射在变量和属性上的工作方式不同,所以如果你依赖反射,使用所有属性会更容易。
  • 您不能对变量进行数据绑定。
  • 将变量更改为属性是一项重大更改。

其他链接

于 2012-12-12T05:49:10.580 回答
3

对字段不能做的属性可以做的一件事是限制 setter 或 getter 的可见性:

public string MyProperty { get; private set; }

我经常使用的东西。

而你不能用字段做的事情(更强大的)是在接口中定义它们。假设您想要一个需要实现类具有特定属性的接口:

public interface MyInterface
{
    string MyProperty { get; }
}

请注意,这里不需要设置器。完全取决于实现类来确定它们应该如何设置 MyProperty。

于 2012-12-12T05:49:58.197 回答
1

这是一个非常小的示例,说明您可以使用字符串属性而不是简单地使用字符串。

假设您有一个名为的私有变量:

private string _name;

现在假设您想让该字符串只读?换句话说,您无法更改该值。您可以使用以下内容:

public string Name 
{
    get { return _name; }
}

它可以让您控制对该值的访问。或者,您可以拥有它,以便该变量只能写入执行以下操作:

public string Name
{
    set { _name = value; }
}

现在,如果您将其放在一起,它将允许您设置值或简单地获取值。请参阅以下内容:

public string Name
{
    get { return _name; }
    set { _name = value; }
}

您可能想知道这样做有什么意义,因为看起来您可以使用常规字符串做同样的事情,当然,但这控制了从不是从所述类派生的外部类对 _name 变量的直接访问。

现在,如果您想控制该值的设置方式怎么办?如果您想进行一些计算,或者您想为该值添加前缀或后缀怎么办?您执行以下操作:

public string Name
{
    get
    {
        return _name;
    }
    set
    {
        if (value.ToLower() == "bilbo")
            _name = "Bilbo Baggins";
    }
}

现在,如果将类的 Name 属性设置为 bilbo,_name 的值将设置为 Bilbo Baggins,而如果将属性设置为 Amy,_name 变量将仅包含 amy。

您可以这样做以保证属性设置的任何值都自动为大写或小写,或者您可以对值或类似的东西进行一些验证。

我希望这能解释属性的用途以及它们如何有用而又不会使其过于复杂。

于 2012-12-12T06:12:54.790 回答
0

属性为您提供了更大的灵活性,尤其是在 .NET 中。C# 显示出对属性的偏见,因此请记住这一点。但是,作为一般规则,在获取或设置需要“处理”或伴随操作时使用访问器/修改器。使用字段来保存值。例如,

public class Name
{
  public string First;

  public string Last;

  public string Full{ get { return this.First + " " + this.Last; } }
} 
于 2012-12-12T06:04:05.187 回答