【问题标题】:What does this mean ? public Name {get; set;} [duplicate]这是什么意思 ?公共名称{get;设置;} [重复]
【发布时间】:2010-11-21 13:35:45
【问题描述】:

我经常在 C# 文档中看到这种安静。但它有什么作用呢?

public class Car
{
   public Name { get; set; }
}

【问题讨论】:

  • 我能问一下为什么这被标记为重复吗?这是2009年问的,2011年问的是“原版”!

标签: c# properties


【解决方案1】:

简单来说,它们被称为属性访问器。它们的实现可以解释如下

1.get{ 返回名称} get 访问器中的代码块在属性为 Read 时执行。

2.set{name = value} 当属性分配一个新值时,set 访问器中的代码块被执行。

例如(假设您使用的是 C#)

 class Person
 {
     private string name;  // the name field
     public string Name    // the Name property
     {
         get
         {
             return name;
         }
         set
         {
             name = value;
         }
     }
 }
  1. 现在当你在下面引用这个属性时

    Person p = new Person();// 实例化类或创建对象 “人”类的“p”

    System.Console.Write(p.Name);  //The get accessor is invoked here
    

调用get访问器来读取属性的值,即编译器尝试读取字符串'name'的值。

2.当您分配一个值(使用参数)给“名称”属性时,如下所示

Person p = new Person();
p.Name = "Stack"  // the set accessor is invoked here
Console.Writeline(p.Name) //invokes the get accessor
Console.ReadKey(); //Holds the output until a key is pressed

设置访问器分配值“Stack”到“Name”属性,即“Stack”存储在字符串“name”中。

输出:

堆栈

【讨论】:

  • 一开始有 get 和 set 的原因是什么,为什么不只使用一个 accessor 来设置和 get,这个问题似乎没有人能够简单地回答。
  • @JsonStatham 这样您就可以添加代码以在分配前检查或修改值。例如set { name = value + "."; } 将在字符串中添加一个点。遵循同样的想法,get 可以在返回之前修改值。
  • 只要告诉我正确的语法,我就很好。如果您将“名称”设为静态但使用 getter 和 setter,从同一个类和不同类访问它的语法是什么?
【解决方案2】:

Auto-Implemented Properties

总结:在 C# 3.0 及更高版本中,自动实现的属性使 属性声明更简洁 when 在不需要额外的逻辑 属性访问器。

【讨论】:

    【解决方案3】:

    它被称为自动实现的属性并且是new to C# 3.0。当您对属性的访问不需要任何特殊行为或验证时,这是一种更简洁的语法。它的功能类似于:

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

    因此它节省了大量代码,但如果行为或规则需要更改,您可以稍后修改访问器逻辑。

    【讨论】:

      【解决方案4】:

      这是做的等价物:

      private string _Text;
      
      public string Text 
      {
          get { return _Text; }
          set { _Text = value; }
      }
      

      除非您在类中无权访问私有变量。

      【讨论】:

      • 所以如果你想保留私有变量,你必须使用“旧”格式(如你的例子)?
      【解决方案5】:

      它是以下的简写:

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

      编译器生成成员变量。这称为automatic property

      【讨论】:

      • ...虽然该字段的名称实际上是一个“无法形容的”名称(例如<>__name),但它作为 C# 标识符是无效的。这会阻止您直接从代码中访问该字段。规范术语是“自动实现的属性”,但大多数人确实称它为自动属性:)
      • ...但是为什么?为什么这 anypublic string Name; 不同?
      • @Qix 是字段的语法。属性和字段在语义上是不同的;有理由在各种情况下使用一种或另一种。
      • @Bryan,如果这些原因和情况构建了使用自动属性的上下文,则应该对其进行解释。不幸的是,这里和其他问题的所有答案都缺乏这种解释。
      • @Brian:好的,抱歉。我的观点是 Qix 提出的问题:在阅读了所有答案和 cmets 之后,我仍然不明白自动属性语法与简单声明相比的优势。我希望一些原因和解释可以澄清这一点。
      【解决方案6】:

      这是一个自动读写属性。这是 C# 3.0 的补充。比如:

      public class Car {
          private string name;
          public string Name { get { return name; } set { name = value; } }
      }
      

      除了你不能直接访问支持字段。

      【讨论】:

        猜你喜欢
        • 2017-08-24
        • 2015-01-04
        • 1970-01-01
        • 1970-01-01
        • 2017-06-30
        • 2011-10-09
        • 2020-09-01
        • 1970-01-01
        • 2023-03-23
        相关资源
        最近更新 更多