返回首页

就在几分钟前,我读 - 一个相当常常听到 - 在C#书有关物业的使用和他们的私人领域,它说,以避免直接设置或获取私有字段的提示。只要大家都知道,在一般情况下是有益的访问错误检查和变化的属性,可在一个地方,物业。如果这是唯一的真理,一个懒惰启动的情况下,字段可能,因此应避免一般,对不对?
但是,据我所知领域的执行速度要比在C#特性(尤其是在循环)。我觉得这是一个关于这个主题的文章在CodeProject上(无法找到发现])。性能优化领域至少应使用尽可能正确?
那么什么是你的意见/最佳做法?

回答

评论会员:OriginalGriff 时间:2012/02/06
号属性和字段是非常不同的动物。

字段用于内部类存储 - 如果你让他们接触到外面的世界,那么你是固定的类的设计,因为你不能改变你的类是如何工作,而不考虑对外部世界的影响。从一个角度的可靠性/维修点,这是一个非常糟糕的主意。

属性是效果超级字段:可以公之于众阅读,私下写(或反之亦然),这进一步限制了外界可以做你的类的数据。他们还可以充当返回处理信息的领域,这是不单独举行。

他们可以多,远远超过类似领域的有效。例如,考虑一类控股的学生。你可以检索有关学生的项目之一,是他们的照片,分辨率高:2048到2048年,全彩色。如果你使用图像字段,那么你总是有来撷取影像,当您创建学生实例,从数据库中获取所有记录的信息。

如果这些表通常显示没有图像,那么这是令人难以置信的时间,内存和数据库的带宽wastefull。如果您使用的属性,然后你可以检索,只有当它被要求的形象:
private Image studentPhoto = null;

public Image StudentPhoto

   {

   get 

      {

      if (studentPhoto == null)

         {

         studentPhoto = GetImage();

         }

      return studentPhoto;

      }

   }
评论会员:Naerling 时间:2012/02/06
有趣。虽然我从来没有听说造成性能问题的性质(没有进一步的逻辑属性反正)我想可能有轻微的开销。 。NET中的一个性质是没有超过一个get和set方法的包装。这意味着,在IL属性只是像任何其他的方法。
当然,你可以把很多属性代码(虽然这是通常不推荐),这可能导致性能问题。
我个人尝试属性尽可能多打电话给我,因为他们可以得到一些验证逻辑,或致电OnPropertyChanged。我只是想确保我的代码中获益,而无需通过我的课去改变到所有的电话呼叫我的财产,我的领域(除非出于某种原因,我想解决这个问题)。
性能损失是很轻微,你应该甚至没有去想它的顶部。 {A}]。优化,那将是非常徒劳{S0的}
]
],CP的文章中,您提到

顺便说一下,从经验上讲,把许多逻辑属性是一个坏主意。我有一个物业,取得了一些调用的数据库(其实我做了一个ObjectContext LINQ查询)。结合这些属性的每个值当我改变引起了我的程序挂起大约两秒钟......现在,需要优化,但不一定,因为他们的属性

编辑:
看到法案在下面的评论。他是完全正确的,并纠正我在我的答案不完整{S0}
评论会员:游客 时间:2012/02/06
埃斯Harlinn:如果你想了解如何实际工作有几个信息来源在网络上提供了宝贵的见解:{A4纸}]-这是NET框架的球员,使得它可以生成本地代码,微软上运行的所有二进制文件。{A5}]简单的属性,通常会被内联优化,所以到底有没有性能损失。最好的问候埃斯Harlinn
BillWoodruff:你有三个优秀的答案在这里(其中有我的5),但我将添加一个扩展方面的评论,你的发言,你读...重属性... "你应该避免设置或获取私有字段直接。"

我有一种感觉,你阅读时,在时间方面的内容。NET中,你必须明确地定义由物业使用私有变量。
例如
private int _theInt;

 

public int TheInt

{

  get { return _theInt; }

  set { _theInt = value; }

}
它在那个时代被认为是"坏表",直接操纵的私人的变量_theInt,和肯定"犯规",曾经使该变量的公共"。
,当然现在,在"现代C#",你只是写:
public int TheInt { get; set; }
的编译器为你生成(隐藏)支持场

到什么程度的处理应在得到和属性集的面向对象的philes之间的不同意见。我个人不希望看到"作为一个替代方法调用属性,但是这只是我个人的口味。

...编辑...

例如,这里是1对计算在属性评论中1的ç#讨论论坛由鲍勃Janova,别人谁我为一体的最周到和口齿伶俐的评论员,我们幸运到有共享的CP [专家知识把{A6的}最近线程:

"我宁愿同意使用物业的戴维??当你想读的值是唯一指定对象的当前状态,并阅读他们有没有副作用,不需要广泛的处理*,物业是适当的。碰巧的是,他们正在实施动态计算,但在逻辑上,这些价值观是国家的一部分(你可以设置当你修改状态,即直径)等查询,他们被查询对象的状态,这是是什么性质。

(*:这是那些东西,原则上,不应该的问题之一,但如果你调用一个属性的getter,你想到的是,在时间上几乎是免费的,所以它另外,顺便说一句,我一次。写1的XML类而构建整个DOM树时,你指定其Text属性我认为是可能的滥用,虽然属性setter的规则是较为宽松;。设置属性会导致如数据绑定和屏幕广泛的重新计算和侧面效果刷新)"。