【问题标题】:Local variable vs private field effeciency局部变量与私有字段效率
【发布时间】:2017-12-01 09:18:31
【问题描述】:

是否有关于何时超越另一个的经验法则?

我很好奇,因为我在这里遇到了一个难题,我有一个非常常用的方法,返回一个相当大的自定义类类型。我想知道在字段中保存这个自定义类的实例是否会更便宜,然后在方法中每次都更改并返回它,而不是像我有一个新类那样创建一个全新的对象每次在方法中创建的实例。

【问题讨论】:

  • 是的,有一个规则,而且很简单:当需要局部变量时,使用局部变量;当你需要一个字段时,使用一个字段。
  • 两者在功能上会做不同的事情,您需要首先验证行为变化是否正常。
  • 当你返回一个类的instance时(你不能返回一个类),你返回它的引用。该对象仍将位于堆上,无论它是局部变量还是字段。而且字段和局部变量之间的选择不是效率问题,而是功能问题。
  • @K_Nielsen... 返回字段(具有类类型)总是比每次调用创建新实例要快。但不要忘记,如果您返回字段,则返回参考。
  • @Vasek 这是一个大胆的声明。您是否有任何指向说明此内容的文档的链接?您的第二条语句“如果返回字段,则返回参考”是什么意思?

标签: c# variables methods scope


【解决方案1】:

返回一个新创建的类实例和返回一个字段之间的主要区别是巨大的:在后一种情况下,实例是共享的,因为所有客户端都会收到指向同一个实例的指针。这意味着:每当任何客户端(或实例的原始创建者)更改实例中的某些内容时,所有客户端现在都将看到所有这些更改。在前一种情况下,所有实例都是不同的,更改只影响当前客户端。

因此,请仔细查看需求并找出需要哪些行为。弄错它们可能会产生毁灭性的影响。

【讨论】:

  • 解决这个关键问题的第一个答案,投赞成票!
【解决方案2】:

您似乎要求的是所谓的惰性字段。你把它声明为System.Lazy<> 就像这样

private System.Lazy<YourClass> mYourClassInstance;

...

mYourClassInstance = new System.Lazy<YourClass>(() => new YourClass());

然后你就可以通过

mYourClassInstance.Value

你想要的任何地方,但值(实例)只创建一次。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-07
    • 2015-09-26
    • 1970-01-01
    • 1970-01-01
    • 2014-10-27
    • 2016-12-01
    相关资源
    最近更新 更多