C#属性,这两种实现方式有什么区别?

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;
        }
    }

请注意,您可以向第二个示例提供修饰符,例如 private set;,以使其成为外部世界的getter属性。 - Silvermind
7个回答

6
第一种是使用后备字段实现常规属性,第二种是自动实现属性,由于编译器将为您生成后备字段,因此不会使用字段。
自动实现属性可使您免于编写后备字段和用于访问它们的样板代码,编译器在IL中创建C#不可命名的后备字段,这些字段不会与类中的其他字段名称冲突。
最终效果是它们是等效的,尽管我听说过由于后备字段名称而导致自动属性序列化问题的情况,让我找到这个问题...对不起,我目前无法找到它。

2

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


1
第二种实现称为“自动属性”,这是在3.0框架中引入的功能。
在3.0框架之前,第一种实现是传统方式。
查看此链接以获取自动属性示例。 在幕后,自动属性将为您生成支持字段。
也请查看此链接,了解反对使用它们的论点

1
你可以在第一个实现中直接访问底层。
但事实上,第二个实现在幕后生成了第一个实现,只是使用其他支持属性。

1

这两种方式在功能上是相同的,但在第二种方式中,你的私有变量 _var1_var2 永远不会被使用。

在第一种方式中,你使用属性返回私有变量的实例。

在第二种方式中,编译器会在后台生成字段并处理它们的赋值,因此你不需要显式声明它们。


0
在第二种情况下,编译器会自动为您添加一个字段,并包装属性。这基本上相当于使用后备字段来完成它。

0

对于开发人员来说,两者完全相同。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接