C# C中的属性#

C# C中的属性#,c#,properties,accessor,C#,Properties,Accessor,为什么我们能够写作 public int RetInt { get;set; } 而不是 public int RetInt { get{return someInt;}set{someInt=value;} } 这两者之间的区别是什么?此功能是在C#3.0中调用和引入的 在C#3.0及更高版本中,自动实现的属性使 当不需要额外的逻辑时,属性声明更简洁 在属性访问器中。它们还允许客户端代码创建 物体。当您声明如下所示的属性时 例如,编译器创建一个私有的匿名支持字段 只能通过属性的

为什么我们能够写作

public int RetInt
{
   get;set;
}
而不是

public int RetInt
{
   get{return someInt;}set{someInt=value;}
}
这两者之间的区别是什么?

此功能是在C#3.0中调用和引入的

在C#3.0及更高版本中,自动实现的属性使 当不需要额外的逻辑时,属性声明更简洁 在属性访问器中。它们还允许客户端代码创建 物体。当您声明如下所示的属性时 例如,编译器创建一个私有的匿名支持字段 只能通过属性的get和set访问 访问者

谢谢你的提问

这两者的区别是什么

就你而言,没有。由于您在设置或检索值时没有执行任何操作,但假设您需要执行一些验证或执行其他类型的检查,则:

private int someInt;
public int RetInt
{
    get
    {
        if (someInt > 0)
            return someInt;
        else
            return -1;
    }
    set { someInt = value; } // same kind of check /validation can be done here
}
无法使用自动实现的属性执行上述操作

在初始化自定义类类型属性时,可以看到另一个不同之处

如果您有
MyClass
然后,对于普通属性,可以初始化/实例化其支持字段,而不是构造函数

private List<MyClass> list = new List<MyClass>();
public List<MyClass> List
{
    get { return list; }
    set { list = value; }
}
private List=new List();
公开名单
{
获取{返回列表;}
设置{list=value;}
}
如果是自动实现的属性

public List<MyClass> SomeOtherList { get; set; }
public List SomeOtherList{get;set;}

只能在构造函数中初始化
SomeOtherList
,不能在字段级别进行初始化

这些是自动实现的属性。有关更多信息,请参阅

引入这些变量的基本原因是为了减少程序员在创建像
someInt
这样的私有变量时的开销,该变量与在属性中使用相比用处不大

这两个有什么不同

至少有两点不同:

  • 在普通属性中,您必须在之前定义一个字段(
    someInt
  • 在normal属性中,您可以在
    set/get
    修改器中设置断点,而在auto属性中则不能这样做
    换句话说:如果您需要“just property”,请使用自动属性,如果您需要对工作流进行更多控制(在
    上引发事件,设置
    ,调试,运行内部的其他内容),请使用“normal”属性。

    实际上,这些属性并没有什么不同,在这两种情况下,您都有一个与您的属性相对应的私有字段,但在第一种情况下,它是由编译器生成并隐藏的

    如果您需要在类中经常使用属性后面的变量,我认为最好以旧的方式(第二种方式)声明您的属性,因为每次您访问它时,如果您以“新”的方式进行,则会调用getter


    如果您只需要在类外使用它(或在大多数情况下),那么您可以使用“新”方式(第一个)

    这并不能真正回答问题。@AshBurlaczenko,他们的问题是为什么允许使用它,原因->它的自动实现属性,两者之间的区别,我只是补充了我的回答,我想应该提到为什么会这样做。在使用“new”/“auto-implemented”字段时,是否有方法访问“behind”属性(我尝试使用_varName访问公共varName{get;set;},因为这似乎是Microsoft的惯例,但是编译器无法识别_varName)。有没有我丢失的代币或其他可以使用的东西?谢谢。不,无法直接访问自动生成的字段。当该属性不是虚拟属性时,编译器可以编写在同一类中使用时直接访问该字段的代码,但当前编译器不这样做。但是请注意,JIT极有可能内联varname_get方法,这使得使用它不比直接使用字段慢。(同样,除非自动属性是虚拟的)。可能重复的
    public List<MyClass> SomeOtherList { get; set; }