1

具有空访问器或没有访问器的属性之间的区别?

// Property with empty accessors
public string Name { get; set; }

// Property without accessor
public int Counter;

编辑:

编译器声明之外的含义意味着这样

4

3 回答 3

4

实际上第二个不是财产,而是公共领域。

C# 中的属性只是两种方法的快捷方式——访问器和修改器(或获取和设置)。所以,当你写一些像

private string _name;

public string Name 
{ 
   get { return _name; } 
   set { _name = value;  }
}

编译器实际上会创建两个方法

public string get_Name() { return _name; }
public void set_Name(string value) { _name = value; }

当你写

public string Name { get; set; } 

然后编译器将生成这两种方法并_name为您生成后备存储(字段)。

当您不使用getandset时,它是简单字段(如_name),编译器不会生成任何方法。

对于您的第二个问题: C# 中的字段和属性有什么区别

因为属性实际上是一种方法,所以它们可以是抽象的或虚拟的,可以被覆盖。属性可以是接口的一部分。属性可用于数据绑定。您可以向属性添加任何逻辑(例如引发某些事件、延迟加载或执行验证)。您可以定义不同的访问级别来设置和获取属性(例如私有和公共)。对于公共领域来说,这一切都不是真的。

于 2012-04-18T07:07:38.587 回答
3

对于第一个编译器将生成私有字段,例如:

private string _name;
public string Name { get {return _name;} set { _name = value; } }

第二个只是一个公共领域。

此外,您可以覆盖派生类中的属性(如果您不能使用字段)。

对 SO 的含义有很好的解释:为什么公共字段比属性更快?

于 2012-04-18T07:09:23.377 回答
0
public string Name { get; set; }

此语法将创建一个自动属性。这是一个简写,相当于:

private string _name;

public string Name
{
    get
    {
        return this._name;
    }

    set
    {
        this._name = value;
    }
}

这与此语法不同:

public string Name;

这将创建一个公共字段。

不同之处在于,字段是一块内存,属性实际上是获取或设置实例值的方法的简写。虽然两者似乎具有相同的行为,但它们却有着微妙的不同。

一般来说,您希望使用所有面向公众的值的属性,因为它们是围绕您自己的内部实现的抽象。如果您想稍后将属性的内部 getter 实现更改为更复杂的东西,那么您的类的公共接口不会更改,并且使用您的类的任何东西都看不到更改。

一般来说,您总是希望为您的公共成员使用属性。这样做没有真正的成本,它使您的对象更易于维护。

于 2012-04-18T07:24:19.280 回答