【问题标题】:C# , Difference between property with variable and without variable [duplicate]C#,带变量和不带变量的属性之间的区别[重复]
【发布时间】:2011-09-06 05:27:39
【问题描述】:

可能重复:
What's the difference between encapsulating a private member as a property and defining a property without a private member?

我知道属性的基本功能。但是当我深入阅读文档时,我看到它们只是用 get set 声明而没有 variables 。

这两者有什么区别

public int EmpCode
{
    get { return _strEmpCode; }
    set { _strEmpCode = value; }
}  

public int EmpCode
{
    get; 
    set; 
}  

随着 .net 框架的升级,它只是一种更简单的编写方式吗?还是有什么功能上的区别?

【问题讨论】:

    标签: c# properties automatic-properties


    【解决方案1】:

    后者被称为自动属性并且是相同的。它们是在 C#3 中引入的,你可以在这里阅读更多关于它们的信息:http://trashvin.blogspot.com/2008/05/automatic-properties-and-object.html

    简单地说,自动属性是语法糖,因此开发人员只需键入更少的代码,编译器将为您生成私有字段以及公共 setter 和 getter。

    【讨论】:

    • 这是适用于所有数据类型的简写吗?
    • @Nithesh Hebri - 确实如此。
    • 它包含在 .net framework 3.5 中?
    • @Nithesh Hebri - 是的,.NET 3.5 正在运行 c# 3.0
    【解决方案2】:

    这称为自动属性。没有功能上的区别。后者的语法只是前者的简写。

    C# specification 的第 10.7.3 节提供了更多详细信息:

    当一个属性被指定为一个自动实现的属性时,一个隐藏的支持字段自动可用于该属性,并且访问器被实现为读取和写入该支持字段。

    下面的例子:

    public class Point {
       public int X { get; set; } // automatically implemented
       public int Y { get; set; } // automatically implemented
    }
    

    等价于以下声明:

    public class Point {
       private int x;
       private int y;
       public int X { get { return x; } set { x = value; } }
       public int Y { get { return y; } set { y = value; } }
    }
    

    【讨论】:

    • 功能上没有区别,但是如果你要序列化自动道具,你会得到令人困惑的支持字段名称,这可能非常烦人
    【解决方案3】:

    它被称为自动属性,如果您不需要属性内的任何逻辑,它只是一种更简单的编写方式。编译后,编译器会自动为属性生成一个支持变量,所以它是完全一样的。

    稍后将属性更改为具有支持字段和一些逻辑的属性很容易,如果您只是先使用公共字段,这将不会破坏任何依赖此属性的代码,然后将其更改为一个属性,您将破坏依赖此字段/属性的代码。

    【讨论】:

    • 这是适用于所有数据类型的简写吗?
    • @Nithesh Hebri - 确实如此。
    【解决方案4】:

    第二种方式实际上是自动属性,它隐式实现了支持字段,这意味着您不能影响生成的字段名称。

    大多数时候您并不关心,但是在使用序列化/反序列化在层之间传递对象的情况下,您在某些情况下会显式创建支持字段,以便摆脱 __propBackingField2735t34 上的类似名称客户。

    此外,在显式编码的属性中,可以包含一些用于验证的逻辑,而自动属性则不是这种情况

    【讨论】:

      【解决方案5】:

      这是对 C# 3.0 的增强,称为自动实现的属性,一个私有的支持字段由编译器在后台自动创建

      【讨论】:

        【解决方案6】:

        没有功能上的区别。但是如果您想要更多的属性设置/获取功能,您可以使用带有私有变量的版本..

            public int EmpCode
            {
                get { return _strEmpCode > 0 ? 100 + _strEmpCode : 0; }
                set
                {
                    if (value > 0)
                        _strEmpCode = value;
                }
            }
        

        否则,您可以简单地使用没有私有变量的版本。

        【讨论】:

          猜你喜欢
          • 2013-12-16
          • 1970-01-01
          • 2014-03-13
          • 1970-01-01
          • 2016-03-22
          • 1970-01-01
          • 2015-08-11
          • 1970-01-01
          相关资源
          最近更新 更多