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


When to use get and set in C# class declaration

本问题已经有最佳答案,请猛点这里访问。

0

使用的区别是什么

1
public string Username { get; set; }

并使用

1
public string Username;

我一直在使用第一个,但我想知道这两者之间是否有任何区别,以及其中一个应该比另一个更喜欢的场景。


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

虽然

1
public string Username;
  • 是公共变量。

为了进行更多的比较,

  • 反射在变量和属性上的工作方式不同,所以如果您依赖于反射,那么使用所有属性就更容易了。
  • 不能对变量进行数据绑定。
  • 将变量更改为属性是一种破坏性的更改。

其他环节

  • 属性与公共变量

对于不能对字段执行的属性,可以执行的一项操作是限制setter或getter的可见性:

2

我经常用的东西。

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

1
2
3
4
public interface MyInterface
{
    string MyProperty { get; }
}

请注意,这里不需要有setter。如何设置MyProperty完全取决于实现类。


下面是一个非常小的示例,其中一种方法可以使用字符串属性而不是简单地使用字符串。

假设您有一个名为:

1
private string _name;

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

1
2
3
4
public string Name
{
    get { return _name; }
}

它允许您控制对该值的访问。或者,您可以使用它,这样变量只能通过执行以下操作进行写入:

1
2
3
4
public string Name
{
    set { _name = value; }
}

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

1
2
3
4
5
public string Name
{
    get { return _name; }
    set { _name = value; }
}

您可能想知道这有什么意义,因为看起来您可以对常规字符串执行相同的操作,当然,这可以控制对外部类(这些类不是从所述类派生的)的名称变量的直接访问。

如果你想控制这个值是如何设置的呢?如果您想做一些计算,或者您可能想给这个值添加前缀或后缀,该怎么办?您可以执行以下操作:

1
2
3
4
5
6
7
8
9
10
11
12
public string Name
{
    get
    {
        return _name;
    }
    set
    {
        if (value.ToLower() =="bilbo")
            _name ="Bilbo Baggins";
    }
}

现在,如果将类的name属性设置为bilbo,name的值将设置为bilbo baggins,而不是将属性设置为amy,name变量将仅包含amy。

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

我希望这能解释属性的用法以及它们如何在不使其过于复杂的情况下有用。


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

4