【问题标题】:C# Shorthand Property QuestionC# 速记属性问题
【发布时间】:2009-03-26 19:58:28
【问题描述】:

所以这里有一些我以前从未见过的语法,有人可以告诉我这是什么意思吗?不确定这是否应该是抽象属性声明或其他什么的简写。

public Class1 myVar { get; set; }

无论如何,Class1 是一个抽象类。

【问题讨论】:

    标签: c# properties


    【解决方案1】:

    在 C# 3.0 及更高版本中,auto-implemented properties 在属性访问器中不需要其他逻辑时使属性声明更加简洁。它们还使客户端代码能够创建对象 当您如下例所示声明属性时,编译器会创建一个私有的匿名支持字段,该字段只能通过属性的 get 和 set 访问器访问。

    // Auto-Impl Properties for trivial get and set
        public double TotalPurchases { get; set; }
        public string Name { get; set; }
        public int CustomerID { get; set; }
    

    【讨论】:

    • 我会投票赞成你有更彻底的解释,但我今天全力以赴。
    【解决方案2】:

    这是让编译器为您创建(隐藏)字段的语法。

    也很有用的是:

    public Class1 myVar{ get; private set; }
    

    【讨论】:

    • protected 也可以。就像private。我相当确定您也可以为 get 设置可访问性,但我从未尝试过。
    • +1 这正是我正在寻找的。我想在简写中包含一些东西,所以set 操作只能由类成员函数完成。谢谢:-)
    【解决方案3】:

    它可能看起来像一个抽象属性或来自接口的属性,但它远非如此。为了鼓励开发人员使用属性(由于许多原因它们是最佳实践),Microsoft 决定在 C# 3 中包含此功能,以便您更轻松地声明属性。

    这是创建属性的标准方法:

    String foo;
    
    public String Foo
    {
        get { return this.foo }
        set { this.foo = value; }
    }
    

    现在这需要大量的输入,而且由于开发人员对核心很懒惰,有时我们很想创建公共字段来节省一些时间。

    现在使用 C# 3 编译器我们可以做到这一点:

    public String Foo { get; set; }
    

    虽然这看起来有点奇怪,但请考虑一下编译器代表您所做的工作。之前的代码编译成这样:

    [CompilerGenerated]    
    private string <Foo>k__BackingField;
    
    public string Foo
    {
        [CompilerGenerated]
        get
        {
            return this.<Foo>k__BackingField;
        }
        [CompilerGenerated]
        set
        {
            this.<Foo>k__BackingField = value;
        }
    }
    

    因此,即使语法看起来有点奇怪,您仍然可以完全按照您习惯的方式创建属性。

    【讨论】:

      【解决方案4】:

      它被称为自动或auto-implemented 属性,它不是抽象的。您可以按原样使用该属性。编译器会在后台为其创建一个后备存储。

      这很像只使用字段而不是属性,但是您可以获得属性语义,并且可以将其用于需要属性的数据绑定等事情。

      【讨论】:

      • 您可以稍后更改为显式实现,而无需更改与调用者的接口。
      【解决方案5】:

      它是一个属性的简写,它只在字段中存储值。所以它相当于:

      private Class1 _myVar;
      
      public Class1 myVar
      {
        get{ return _myVar; }
        set{ _myVar = value;}
      }
      

      它只是一个简单的属性,以后可以在不改变界面的情况下用更复杂的 evantuation 替换。

      【讨论】:

        【解决方案6】:

        这些是自动实现的属性。它们使您可以使代码更简洁。你可以在这里阅读更多关于它们的信息:

        Auto-Implement

        您还可以使访问器具有不同的访问级别:

        公共 int MyVar { 获取;私人套装; }

        这允许您将属性暴露给类外部并仍然在内部设置它。

        【讨论】:

          【解决方案7】:

          自动获取器和设置器。

          【讨论】:

            猜你喜欢
            • 2010-12-26
            • 1970-01-01
            • 2018-11-03
            • 2013-05-23
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2012-03-04
            • 2010-12-29
            相关资源
            最近更新 更多