【问题标题】:Difference between property defining (with and without {get; set;})属性定义之间的区别(有和没有 {get; set;})
【发布时间】:2013-04-21 02:36:16
【问题描述】:

我有这个

public int CityId { get; set; }

public int CityId;

如果我首先使用 - 它首先在 EF 代码中工作,而第二个 - 则不行。但是如果我定义{get; set;} 并且什么都不做,那么简单定义之间的确切区别是什么?我知道我可以在{get; set;} 布局中添加一些额外/自定义的代码,但如果没有{get; set;},它的工作方式不完全相同吗?

【问题讨论】:

  • 后者是字段,前者是属性。
  • 从长远来看,属性提供了额外的好处(比如声明为virtualabstract 或在接口中的能力)。有时重要的是,即使调用/使用代码可能相同(向/从看起来赋值/获取值就像相同的 C# 语法),切换是一个重大更改。利用您的代码的第三方必须重新编译他们的代码以匹配更改。如果他们只是替换已编译的 DLL 而不重新编译,他们将收到运行时错误。
  • 我不能代表 EF,但我过去使用 NHibernate 的经验要求成员是属性(甚至可能是虚拟的?也许只是为了懒惰加载包/收藏)因为它会即时编译 subclasses ,这将覆盖/实现属性行为以延迟从数据库加载数据。这种行为(可能)不可能使用字段。

标签: c# properties definition


【解决方案1】:
public int CityId;

这是一个字段。

public int CityId { get; set; }

这是一个属性,编译器会自动为你生成一个私有字段来支持该属性。

它们是两种不同的东西。属性提供 getter、setter 或两者。对属性的“get”和“set”操作被编译为方法调用。

字段只是一个暴露的变量。公开字段通常被认为是不好的做法。

【讨论】:

  • It is generally considered bad practice for properties to be public. - 你的意思是变量而不是属性,或者,如果不是,你能解释一下原因吗?
  • 我指的是字段,而不是属性。这是我今天在 SO 答案中犯的第二个明显和可怕的错误......
  • 别担心 :)) 你很有帮助 :))
【解决方案2】:

使用这种语法:

public int CityId { get; set; }

您实际上是在创建一个自动实现的属性,并在幕后将其转换为:

private int _CityId;
public int CityId { 
    get
    {
        return _CityId;
    } 
    set
    {
        _CityId = value;
    }
}

这个语法:

public int CityId;

只是一个字段

【讨论】:

    【解决方案3】:

    您正在寻找的差异称为封装。

    example

    在您的示例中,字段和属性之间没有太大区别。该字段比属性具有更好的性能,因为它不需要调用方法来访问它。无论如何,一个字段的缺点是每个人都可以访问它,而您(持有该字段的类)对此没有任何控制权。

    【讨论】:

    • 我认为您的回答将我的问题解释为对 cdhowie 回答的评论!谢谢!
    猜你喜欢
    • 2018-11-17
    • 2018-07-30
    • 1970-01-01
    • 1970-01-01
    • 2021-01-08
    • 2012-05-11
    • 2014-12-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多