小编nbe*_*e11的帖子

使用Reflection确定哪些字段是属性的后备字段

我正在使用反射来绘制对象.这些对象在托管代码中,但除了通过反射之外,我无法看到它们的源代码,底层结构等.所有这一切的首要目标是对象的基本内存映射(类似于SOS.dll DumpObject!ObjSize命令的功能).因此,我试图确定哪些成员被"重复计算"为一个字段和一个属性.

例如:

public class CalendarEntry
{
    // private property 
    private DateTime date { get; set;}

    // public field 
    public string day = "DAY";
}
Run Code Online (Sandbox Code Playgroud)

映射时显示:

  • 字段
    • k__BackingField
  • 属性
    • 日期

像这样的一个类:

public class CalendarEntry
{
    // private field 
    private DateTime date;

    // public field 
    public string day = "DAY";

    // Public property exposes date field safely. 
    public DateTime Date
    {
        get
        {
            return date;
        }
        set
        {
                date = value;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

映射时显示:

  • 字段
    • 天 …

c# reflection field properties memory-consumption

10
推荐指数
1
解决办法
3523
查看次数

SOS.dll ObjSize和DumpObject引擎盖下的复杂性.如何在C#中重新创建SOS.dll?

这个问题主要基于我在发现的帖子.

我正在尝试使用反射重新创建SOS.dll的一些功能.特别是ObjSizeDumpObject命令.我使用反射来查找所有字段,然后如果字段是基本类型,我将基元类型的大小添加到对象的整体大小.如果字段是值类型,那么我递归调用原始方法并沿着参考树向下走,直到我点击所有基本类型字段.

我一直在使对象大小比SOS.dll ObjSize命令大两倍左右.我发现的一个原因是我的反射代码似乎是在寻找SOS忽略的字段.例如在字典中,SOS找到以下字段:

  • 水桶
  • 计数
  • 空闲列表
  • freeCount
  • 比较器
  • 按键
  • _syncRoot
  • m_siInfo

但是我的反射代码找到了以上所有内容并且还发现:

  • 版本名称
  • HashSizeName
  • KeyValuePairsName
  • ComparerName

另外,我对SOS ObjSize和DumpObject命令中发现的不一致感到困惑.我知道DumpObject不会查看引用类型的大小.但是,当我在上面提到的字典上调用对象大小时,我得到:

  • 字典 - 532B

然后我在Dictionary上调用DumpObject来获取它的引用类型的内存地址.然后,当我调用Objsize的引用类型时,我得到:

  • 水桶 - 40
  • 条目 - 364
  • 比较 - 12
  • 钥匙 - 492
  • (其余为空或原始)

顶级字典上的ObjSize不应该大致是字典中所有ObjSizes字段的总和吗?为什么Reflection会发现DumpObject的更多字段?有关为什么我的反射分析返回的数字大于SOS.dll的想法?

另外,我从来没有得到上述链接中提出的一个问题的答案.我在询问是否应该在评估对象的内存大小时忽略属性.普遍的共识是忽视它们.但是,我找到了一个很好的例子,说明属性的支持字段何时不会包含在从Type.GetFields()返回的集合中.在String的引擎盖下查看时,您有以下内容:

Object包含名为FirstChar的属性Object包含属性名为Chars的Object包含属性名为Length的对象包含名为m_stringLength的字段包含名为m_firstChar的字段对象包含名为Empty Object的字段包含名为TrimHead的字段对象包含名为TrimTail的字段对象包含名为TrimBoth的字段对象包含名为charPtrAlignConst的字段对象包含字段名为alignConst的m_firstCharm_stringLength是属性的支持领域FirstChar,并Length在半焦物业持有,但该字符串的实际内容.这是一个索引属性,可以索引它以返回String中的所有字符,但是我找不到包含字符串字符的相应字段.

有什么想法吗?或者如何获取索引属性的支持字段?索引属性是否应包含在内存大小中?

c# memory reflection sos

1
推荐指数
1
解决办法
511
查看次数

C#类型擦除问题

将状态机放在C#中.我有一个接口和抽象实现类:

public interface IState<SD> where SD : IStateData {
    T EnterState<T>(InputData inputData, SD movementData) where T : IState<SD>;
}

public abstract class AMovementState : IState<MovementData> {
    public abstract AMovementState EnterState<AMovementState>(InputData inputData, MovementData movementData);
}
Run Code Online (Sandbox Code Playgroud)

MovementData实现IStateData所以这似乎应该工作正常.但是我收到了编译错误:

错误CS0425:类型参数AMovementState' of methodAMovementState.EnterState(InputData,MovementData)'的约束必须与类型参数IState.EnterState(InputData,MovementData)'的约束匹配T' of interface method.考虑使用显式接口实现(CS0425)(Assembly-CSharp)

我认为这是类型擦除的问题,但我不是100%.我需要修改我的方法还是我错过了一些愚蠢的东西?来自大多数Java背景.

c# generics

0
推荐指数
1
解决办法
941
查看次数

标签 统计

c# ×3

reflection ×2

field ×1

generics ×1

memory ×1

memory-consumption ×1

properties ×1

sos ×1