何时在C#类声明中使用get和set

时间:2012-12-12 05:44:35

标签: c#

  

可能重复:
  Difference between Property and Field in C# .NET 3.5+

使用

之间有什么区别
public string Username { get; set; }

并使用

public string Username;

我一直在使用第一个,但想要了解两者之间是否存在任何差异,以及一个人应该优先于另一个的情况。

4 个答案:

答案 0 :(得分:5)

public string Username { get; set; }
  • 是一个财产。

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

更多比较,

  • 反射在变量与属性上的工作方式不同,因此如果依赖于反射,则更容易使用所有属性。
  • 您无法对变量进行数据绑定。
  • 将变量更改为属性是一个重大变化。

其他链接

答案 1 :(得分:3)

使用字段无法处理的属性可以做的一件事是限制setter或getter的可见性:

public string MyProperty { get; private set; }

我经常使用的东西。

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

public interface MyInterface
{
    string MyProperty { get; }
}

请注意,您无需在此处设置setter。完全由实现类来确定它们应该如何设置MyProperty。

答案 2 :(得分: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。

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

我希望这能解释属性的用途以及如何使它们变得有用而不会太复杂。

答案 3 :(得分:0)

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

public class Name
{
  public string First;

  public string Last;

  public string Full{ get { return this.First + " " + this.Last; } }
}