【问题标题】:When to use get and set in C# class declaration [duplicate]何时在 C# 类声明中使用 get 和 set [重复]
【发布时间】:2012-11-29 18:59:14
【问题描述】:

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

使用有什么区别

public string Username { get; set; }

并使用

public string Username;

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

【问题讨论】:

标签: c#


【解决方案1】:
public string Username { get; set; }
  • 是一个属性。

同时

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

更多比较,

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

其他链接

【讨论】:

    【解决方案2】:

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

    public string MyProperty { get; private set; }
    

    我经常使用的东西。

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

    public interface MyInterface
    {
        string MyProperty { get; }
    }
    

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

    【讨论】:

      【解决方案3】:

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

      假设你有一个私有变量叫做:

      private string _name;
      

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

      public string Name 
      {
          get { return _name; }
      }
      

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

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

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

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

      您可能想知道这样做的意义何在,因为看起来您可以使用常规字符串执行相同的操作,当然,但这控制了从非派生自 said 的外部类对 _name 变量的直接访问类。

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

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

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

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

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

      【讨论】:

      • 值得补充的是,您可以在 .NET 中将字段设为只读。
      • 我包括在内。它在上面的帖子中。
      【解决方案4】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-05-08
        • 2014-04-15
        • 2018-08-31
        • 1970-01-01
        • 2020-09-12
        相关资源
        最近更新 更多