C#属性,这两个实现有什么区别?

时间:2013-09-13 08:33:00

标签: c# properties

下面两个POCO类的实现有什么区别?

class Test
    {
        int _var1;
        string _var2;

        public int var1
        {
            get
            {
                return _var1;
            }
            set
            {
                _var1 = value;
            }
        }

        public string var2
        {
            get
            {
                return _var2;
            }
            set
            {
                _var2 = value;
            }
        }
    }

class Test2
    {
        int _var1;
        string _var2;

        public int var1
        {
            get;
            set;
        }

        public string var2
        {
            get;
            set;
        }
    }

7 个答案:

答案 0 :(得分:6)

第一个是带有支持字段的常规属性实现,第二个是auto-implemented properties,并且不会使用这些字段,因为编译器会为您生成支持字段。

自动实现的属性使您无需编写支持字段和样板代码来访问它们,编译器会在IL中创建不会与类中其他字段名称冲突的C#可命名支持字段。

最终效果是 它们是等效的 ,虽然我听说由于支持字段的名称而导致自动属性的序列化问题,让我找到问题...对不起,我现在似乎无法找到它。

答案 1 :(得分:2)

功能明智没有区别。编译器将从第2版生成第一个版本。

答案 2 :(得分:1)

第二个实现称为Auto-Properties,这是框架3.0中引入的一个特性。

第一个实现是框架3.0之前的传统方式。

有关自动属性的示例,请参阅此link。在引擎盖下,自动属性将为您生成支持字段。

请查看此链接,arguments against their use

答案 3 :(得分:1)

您可以在第一个实现中直接访问底层。

但事实上,第二个实现在幕后产生第一个,除了其他支持属性。

答案 4 :(得分:1)

属性在功能上是相同的,但在第二个属性中,您的私有变量_var1_var2将永远不会被使用。

在第一个中,您将使用属性返回私有变量的实例。

在第二种情况下,编译器会生成字段并在后台处理它们的分配,因此您无需显式声明它们。

答案 5 :(得分:0)

在第二种情况下,编译器会自动为您添加一个字段,并包装该属性。它基本上等同于使用支持字段。

答案 6 :(得分:0)

两者对于开发者而言完全相同