3

以下两种 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;
        }
    }
4

7 回答 7

6

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

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

最终效果是它们是等效的,虽然我听说过由于支持字段的名称而导致的自动属性的序列化问题,让我找到问题......抱歉,我目前似乎找不到它。

于 2013-09-13T08:35:31.970 回答
2

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

于 2013-09-13T08:36:08.120 回答
1

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

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

有关自动属性的示例,请参阅此链接。在后台,自动属性将为您生成支持字段。

也看看这个链接,反对他们使用的论据

于 2013-09-13T08:34:59.397 回答
1

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

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

于 2013-09-13T08:35:11.323 回答
1

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

首先,您使用属性返回私有变量的实例。

其次,编译器生成字段并在后台处理它们的分配,因此您无需显式声明它们。

于 2013-09-13T08:35:14.830 回答
0

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

于 2013-09-13T08:36:49.423 回答
0

两者对于开发者来说都是一样的

于 2013-09-13T08:38:51.410 回答