在getter中创建对象是不是很糟糕?

use*_*348 25 c# oop getter

让我们在这样的getter中创建一个对象:

public class Class1
{
       public string Id { get; set; }
       public string Oz { get; set; }
       public string Poznamka { get; set; }

       public Object object
       {
             get
             {
                  // maybe some more code
                  return new Object { Id = Id, poznamla = Poznamka, Oz = OZ };
             }
        }
 }
Run Code Online (Sandbox Code Playgroud)

或者我应该创建一个将创建并返回对象的方法?

Mit*_*eat 22

是的,这是不好的做法.

理想情况下,getter不应该改变或创建任何东西(除了延迟加载,即使那时我认为它会导致代码不太清晰......).这样可以最大限度地降低无意识副作用的风险.

  • 可以使用一个字段 (2认同)
  • 当您在调试器中单步执行`get`实现时,延迟加载可能是一个雷区.提示:关闭属性的调试器评估! (2认同)

Ser*_*kov 16

属性看起来像字段,但它们是方法.众所周知,这会造成惊人的混乱.当程序员看到似乎正在访问字段的代码时,程序员做出的许多假设可能不适用于某个属性.因此,有一些常见的属性设计指南.

  1. 避免从属性getter返回不同的值.如果连续多次调用,则属性方法每次都可以返回不同的值; 每次返回相同的值.

  2. 属性方法可能需要额外的内存或返回对实际上不属于对象状态的内容的引用,因此修改返回的对象对原始对象没有影响; 查询字段始终返回对保证属于原始对象状态的对象的引用.使用返回副本的属性可能会让开发人员感到非常困惑,而且这种特性通常没有记录.

  3. 考虑不能​​将属性作为out或ref参数传递给方法; 一个领域可以.

  4. 避免长期逃避财产.属性方法可能需要很长时间才能执行; 现场访问总是立即完成.

  5. 避免从getter中抛出异常.

  6. 如果属性设置器抛出异常,请保留以前的值

  7. 避免可观察到的副作用.

  8. 允许以任何顺序设置属性,即使这会导致对象的临时无效状态.

来源

" 通过C#CLR ",杰弗里里希特.第9章智能定义属性

" 框架设计指南 "第2版,Brad Abrams,Krzysztof Cwalina,第5.2章财产设计


Ode*_*ded 8

如果你希望你的getter在每次访问时都创建一个新对象,那就是这样做的方法.此模式通常称为工厂方法.

然而,这通常不需要在属性(即getter和setter)上,因此被认为是不好的做法.

  • IMO工厂方法应该命名为"createFoobar",以便非常清楚地创建一个新的Foobar对象.另一方面,在第一次调用时创建对象的延迟加载getter是完全合法的.我希望getter在后续调用中返回相同的对象; 一个懒惰的加载getter做到了. (3认同)
  • 这意味着每次访问 getter 时都会得到一个不同的对象;肯定是个坏主意! (2认同)