【问题标题】:Shortest way of writing a C# property? [duplicate]编写 C# 属性的最短方法? [复制]
【发布时间】:2013-04-08 19:49:54
【问题描述】:

有人告诉我,你可以替换下面的代码:

private string name;

public string Name
{
    get;
    set;
}

具有以下效果且不会受到任何不良影响:

public string Name;

我意识到,在第一个示例中设置的属性与我删除它并将原始属性设置为 public 时的设置几乎相同,但是使用属性的第二种方式是不好的编程习惯您只需要基本的 getter 和 setter 吗?

【问题讨论】:

  • 您的第一个示例将创建两个不相关的成员,nameNameName 是自动属性;它不会使用您编写的name 字段,而是使用您无法直接使用的带有一些疯狂名称的“不可见”字段。如果您想使用自己的变量,请提供访问器的主体,如public string Name { get { return name; } set { name = value; } }

标签: c# syntax standards


【解决方案1】:

第二种方式不是属性,而是字段。您应该始终将属性用于面向公众的值的原因是,从字段转换为属性会构成重大更改。使用属性可以让您稍后更改 getter 或 setter 的行为,而不会破坏任何引用您的代码。

记住,代码 public string Foo { get; set; }

实际上等价于

private string foo;
public string Foo 
{ 
    get { return foo; }
    set { foo = value; }
}

【讨论】:

  • 另外private string name; 在你的第一个例子中有点无意义。
【解决方案2】:

当您使用属性时,您可以更好地控制属性的内容。

private string name;

public string Name
{
    get;
    set;
}

错了应该是

public string Name
{
    get;
    set;
}

private string name;

public string Name
{
    get { return name;}
    set { this.name = value;}
}

有时当您希望仅在您可以使用的类中设置变量时

public string Name
{
    get;
    private set;
}

属性结合了字段和方法的各个方面。对于对象的用户来说,属性似乎是一个字段,访问该属性需要完全相同的语法。对于类的实现者来说,属性是一个或两个代码块,代表一个 get 访问器和/或一个 set 访问器。 get 访问器的代码块在读取属性时执行; set 访问器的代码块在属性被分配一个新值时执行。没有 set 访问器的属性被认为是只读的。没有 get 访问器的属性被认为是只写的。具有两个访问器的属性是可读写的。

来源:http://msdn.microsoft.com/en-us/library/w86s7x04(v=vs.80).aspx

【讨论】:

    【解决方案3】:

    我认为最短的方法是使用Auto-Implemented Properties 和一些关于它们的参考信息

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

    公共字符串名称{ get;设置;}

    【讨论】:

      【解决方案4】:
      public string Name { get; set; }
      

      msdn:

      属性是提供灵活机制来读取、写入或计算私有字段值的成员。属性可以像公共数据成员一样使用,但它们实际上是称为访问器的特殊方法。这样可以轻松访问数据,并且仍然有助于提高方法的安全性和灵活性。

      【讨论】:

        【解决方案5】:

        公共属性与公共实例变量不同。

        这种差异可能很重要。 例如,如果您使用数据绑定 asp.net 控件(如 DroDownListBox 中的 DataTextField),如果将其设置为实例变量而不是公共属性,它将失败。

        【讨论】:

          【解决方案6】:

          编写属性的最短方法是使用自动获取器和设置器

          不过,这并不是您在问题中提出的内容,您已将具有 支持字段传统 属性替换为 字段

          自动 getter/setter 如下所示:

          public string Blah { get; set; }

          我相信这个功能是在 C# 3 中引入的。所以你必须定位到这个或以上,才能使用这些。

          【讨论】:

            猜你喜欢
            • 2021-07-12
            • 2012-01-04
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2010-12-09
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多