C# 具有空访问器的属性与不具有访问器的属性之间的差异

C# 具有空访问器的属性与不具有访问器的属性之间的差异,c#,C#,具有空访问器的属性与不具有访问器的属性之间的差异 // Property with empty accessors public string Name { get; set; } // Property without accessor public int Counter; 编辑: 编译器语句之外的含义意味着什么?实际上,第二个含义不是属性,而是公共字段 C#中的属性只是两种方法的快捷方式——访问器和mutator(或get和set)。所以,当你写一些属性,比如 private stri

具有空访问器的属性与不具有访问器的属性之间的差异

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

// Property without accessor
public int Counter;
编辑:
编译器语句之外的含义意味着什么?实际上,第二个含义不是属性,而是公共字段

C#中的属性只是两种方法的快捷方式——访问器和mutator(或get和set)。所以,当你写一些属性,比如

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; } 
然后,编译器将生成这两个方法并为您生成备份存储(field
\u name

当您不使用
get
set
时,它是一个简单的字段(如
\u name
),编译器不会生成任何方法

关于第二个问题:


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

实际上,第二个字段不是属性,而是公共字段

C#中的属性只是两种方法的快捷方式——访问器和mutator(或get和set)。所以,当你写一些属性,比如

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; } 
然后,编译器将生成这两个方法并为您生成备份存储(field
\u name

当您不使用
get
set
时,它是一个简单的字段(如
\u name
),编译器不会生成任何方法

关于第二个问题:


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

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

private string _name;
public string Name { get {return _name;} set { _name = value; } }
第二个只是一个公共领域

此外,您还可以重写派生类中的属性(在字段不能重写的情况下)


关于SO的含义有很好的解释:

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

private string _name;
public string Name { get {return _name;} set { _name = value; } }
第二个只是一个公共领域

此外,您还可以重写派生类中的属性(在字段不能重写的情况下)

关于SO的含义有很好的解释:

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

private string _name;

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

    set
    {
        this._name = value;
    }
}
这与此语法不同:

public string Name;
这将创建一个公共字段

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

一般来说,您希望使用所有面向公众的值的属性,因为它们是围绕您自己的内部实现的抽象。如果您想在以后将属性的内部getter实现更改为更复杂的内容,则不会更改类的公共接口,并且该更改对于使用类的任何对象都是不可见的

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

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

private string _name;

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

    set
    {
        this._name = value;
    }
}
这与此语法不同:

public string Name;
这将创建一个公共字段

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

一般来说,您希望使用所有面向公众的值的属性,因为它们是围绕您自己的内部实现的抽象。如果您想在以后将属性的内部getter实现更改为更复杂的内容,则不会更改类的公共接口,并且该更改对于使用类的任何对象都是不可见的


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

此行为对性能有一定影响或对多个对象有特殊影响?不需要,在执行过程中,此代码可以内联。即使不会,我也不认为性能损失会很大。公共字段的影响是类的封装。此外,不能将公共属性用于数据绑定。请务必注意,当您将字段重构为属性时,需要重新编译引用此字段/属性的所有其他代码。当您有一个属性并且更改了实现时,这是不需要的。@标记“是”,并且当您使用反射时,属性的处理方式也会有所不同。这种行为对性能有一定影响,或者对多个对象有特殊影响?不必,在执行过程中,此代码可以内联。即使不会,我也不认为性能损失会很大。公共字段的影响是类的封装。此外,不能将公共属性用于数据绑定。请务必注意,当您将字段重构为属性时,需要重新编译引用此字段/属性的所有其他代码。当您有一个属性并且更改了实现时,这是不需要的。@标记“是”,并且当您使用反射时,属性的处理方式也会有所不同。