【问题标题】:C# Object Memory RepresentationC# 对象内存表示
【发布时间】:2016-07-10 20:11:52
【问题描述】:

我有一个基类:

abstract class foo(){
     abstract dynamic DefaultValue { get; }
}

我希望能够从这里继承多个对象并设置默认值:

class bar : foo{
     override dynamic DefaultValue { get { return 0.0f; } }
}

这将如何在内存中表示?每个对象会存储自己的“DefaultValue”,还是每个对象都引用它时只在内存中存储一​​次?

【问题讨论】:

  • 你的问题不是很清楚
  • 我会编辑问题
  • @Rahul 是不是更清楚了?
  • 每个人都会有自己的记忆,因为每个人都是allocated

标签: c# object memory


【解决方案1】:

简短的回答 - 每个对象不会有额外的内存来存储默认值 只有返回语句的只读属性将编译为方法

get_DefaultValue()

【讨论】:

  • 所以只要属性不引用内部变量,您是说下面的编译器会自动将其转换为方法?
  • 编译器总是将一个属性转换为一个或两个方法(一个用于get,一个用于set),在这种情况下,您只有一种方法(get)。仅当您具有显式支持字段或具有自动属性(隐式支持字段)时才分配存储空间,例如 public string Name {get;set;}
  • 没错,这是有道理的。换句话说,我可以安全地将其作为财产保存。如果将它留给默认的 getter 和 setter,它会创建一个内部字段,对吗?
  • 是的,您可以将其保留为属性。另一方面,get+set auto 属性(参见我上面编辑的评论)编译为两个方法和一个支持字段。
【解决方案2】:

DefaultValue 创建一个方法是有意义的:

GetDefaultValue(){ return 0.0f; }

只要方法不占用每个对象的额外内存。另一方面,声明自动属性将始终创建额外的私有字段来保存数据,并且这将添加到您创建的每个对象上,因此内存效率不高。

这确实是一个令人困惑的情况,因为查看this question 会发现自动属性会占用额外的空间。

但是如果你看看 Jon Skeet 的回答 right here,他是在说

单个对象的大小不受属性、方法、事件等数量的影响。

在这种情况下,它们可能具有相同的效果,您可以自己针对大量对象进行测试,但更确定的是创建一个方法,因为它被方法表中的所有对象引用。

【讨论】:

  • 我认为这回答了我的问题。我希望它显然更节省内存,只是在使用它使其成为属性方面感觉更干净。
  • @DavidTorrey 您不必担心单个属性的内存,您应该担心的是应用程序的设计以及要干净的代码。因为这是一个托管环境,所以内存很少会打扰您。
【解决方案3】:

如果是这样的话,我会说让它成为一个通用方法,比如

public T GetTypedefaultvalue<T>()
{
  return default(T);
}

你可以这样称呼它

GetTypedefaultvalue<double>();

(或)

GetTypedefaultvalue<string>();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-02-17
    • 2014-03-07
    • 2010-12-10
    • 2016-08-30
    • 1970-01-01
    • 2023-03-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多