Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/276.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# PostSharp:删除/更换支持字段_C#_Postsharp - Fatal编程技术网

C# PostSharp:删除/更换支持字段

C# PostSharp:删除/更换支持字段,c#,postsharp,C#,Postsharp,我试图找到PostSharp是否可以通过删除/替换支持字段轻松地用于更改类的结构 以下是示例: 比方说,我有一个如下实体 class DataItem { public Int32 Id { get; set; } public String Name { get; set; } public Decimal? HourlyRateMon { get; set; } public Decimal? HourlyRateTue { get; set; } public Deci

我试图找到PostSharp是否可以通过删除/替换支持字段轻松地用于更改类的结构

以下是示例:

比方说,我有一个如下实体

class DataItem
{
  public Int32 Id { get; set; }
  public String Name { get; set; }
  public Decimal? HourlyRateMon { get; set; }
  public Decimal? HourlyRateTue { get; set; }
  public Decimal? HourlyRateWed { get; set; }
  public Decimal? HourlyRateThu { get; set; }
  public Decimal? HourlyRateFri { get; set; }
}
它将在64位=128字节的每个实例上使用4+8+5*20+16字节的开销

我想做的是应用一个方面,通过打包可为空的小数来最小化对象的内存占用,比如

internal class DataItem
{
  private CompactDecimal _hourlyRateFri;
  private CompactDecimal _hourlyRateMon;
  private CompactDecimal _hourlyRateThu;
  private CompactDecimal _hourlyRateTue;
  private CompactDecimal _hourlyRateWed;

  public int Id { get; set; }
  public string Name { get; set; }

  public decimal? HourlyRateMon
  {
    get { return _hourlyRateMon; }
    set { _hourlyRateMon = value; }
  }

  public decimal? HourlyRateTue
  {
    get { return _hourlyRateTue; }
    set { _hourlyRateTue = value; }
  }

  public decimal? HourlyRateWed
  {
    get { return _hourlyRateWed; }
    set { _hourlyRateWed = value; }
  }

  public decimal? HourlyRateThu
  {
    get { return _hourlyRateThu; }
    set { _hourlyRateThu = value; }
  }

  public decimal? HourlyRateFri

  {
    get { return _hourlyRateFri; }
    set { _hourlyRateFri = value; }
  }
}

internal struct CompactDecimal
{
  public uint Offset;

  public static implicit operator decimal?(CompactDecimal d)
  {
    // here I can, for instance, go to a shared stream at the stream offset and read the decimal
  }

  public static implicit operator CompactDecimal(decimal? d)
  {
    // here I can, for instance, serialize the decimal to a shared stream and get the stream offset
  }
}
这将在64位上使用4+8+5*4+16字节的开销=每个实例48字节,每个实例节省80字节。如果我们需要存储数百万个实例,它可以为我们节省大量内存

我尝试创建LocationInterceptionSpect派生属性,但没有得到预期的结果-不仅原始的支持字段仍然存在,而且我还有10个TestAttribute实例(5个属性,每个属性都有get/set):

//字段
[非串行化]
私人遗嘱属性z___方面10;
[非串行化]
私人遗嘱属性z___方面11;
[非串行化]
私人遗嘱属性z___方面12;
[非串行化]
私人遗嘱属性z___方面13;
[非串行化]
私人遗嘱属性z___方面4;
[非串行化]
私人遗嘱属性z___方面5;
[非串行化]
私人遗嘱属性z__;u方面6;
[非串行化]
私人遗嘱属性z___方面7;
[非串行化]
私人遗嘱属性z___方面8;
[非串行化]
私人遗嘱属性z___方面9;
私有十进制?库尤·奥里吉纳尔菲尔德;
私有十进制?库尤·奥里吉纳尔菲尔德;
私有十进制?库尤·奥里吉纳尔菲尔德;
私有十进制?库尤·奥里吉纳尔菲尔德;
私有十进制?库尤·奥里吉纳尔菲尔德;
要么我做错了什么,要么PostSharp不支持我想要实现的目标

遗嘱属性现在不做任何事情-

[Serializable]
public class TestAttribute : LocationInterceptionAspect, IInstanceScopedAspect
{
  public override void CompileTimeInitialize(LocationInfo targetLocation, AspectInfo aspectInfo)
  {
    //base.CompileTimeInitialize(targetLocation, aspectInfo);
  }

  #region <<< Public methods >>>
  public Object CreateInstance(AdviceArgs adviceArgs)
  {
    return MemberwiseClone();
  }

  public override void OnGetValue(LocationInterceptionArgs args)
  {
    //args.
    //base.OnGetValue(args);
  }

  public override void OnSetValue(LocationInterceptionArgs args)
  {
    //base.OnSetValue(args);
  }

  public void RuntimeInitializeInstance()
  {
  }
  #endregion
}
[可序列化]
公共类测试属性:LocationInterceptionSpect,iInstanceScopedSpect
{
公共覆盖无效编译器初始化(LocationInfo targetLocation,AspectInfo AspectInfo)
{
//base.CompileTimeInitialize(targetLocation,aspectInfo);
}
#地区>
公共对象CreateInstance(AdviceArgs AdviceArgs)
{
返回MemberwiseClone();
}
公共覆盖无效OnGetValue(LocationInterceptionArgs args)
{
//阿格斯。
//基准值(args);
}
公共覆盖void OnSetValue(LocationInterceptionArgs args)
{
//基本设定值(args);
}
public void RuntimeInitializeInstance()
{
}
#端区
}

非常感谢您的帮助。

首先,您还需要计算流本身使用的内存。基本上,您只需将Nullable中的bool替换为uint索引,因此不保存任何内容。此外,请注意,在64位机器上,内存被填充为8字节,因此
十进制?
大24字节

保存内存的方法是将可空类型的布尔值打包到位图中。但是,您需要引入一个字段并更改支持字段的类型。PostSharp方面框架不支持此功能

另一种方法是不要使属性自动,并使用一个方面覆盖getter和setter,该方面将使用引入的接口获取或设置值。但是,在这种情况下,每个实例需要多2个对象—实例级方面对象,带有位图和十进制数组来保存值。这将产生这样的开销,只有在类中使用8个可为null的值之后,才能节省内存


一个小小的改进是使用一个公共基类,该基类包含数组和位图。您将不再需要实例级方面,只需要在基类字段中保存十进制数组和位图。此方法将从5个可为空的值开始保存内存。

首先,您还需要计算流本身使用的内存。基本上,您只需将Nullable中的bool替换为uint索引,因此不保存任何内容。此外,请注意,在64位机器上,内存被填充为8字节,因此
十进制?
大24字节

保存内存的方法是将可空类型的布尔值打包到位图中。但是,您需要引入一个字段并更改支持字段的类型。PostSharp方面框架不支持此功能

另一种方法是不要使属性自动,并使用一个方面覆盖getter和setter,该方面将使用引入的接口获取或设置值。但是,在这种情况下,每个实例需要多2个对象—实例级方面对象,带有位图和十进制数组来保存值。这将产生这样的开销,只有在类中使用8个可为null的值之后,才能节省内存

一个小小的改进是使用一个公共基类,该基类包含数组和位图。您将不再需要实例级方面,只需要在基类字段中保存十进制数组和位图。此方法将节省5个可为空值以上的内存

[Serializable]
public class TestAttribute : LocationInterceptionAspect, IInstanceScopedAspect
{
  public override void CompileTimeInitialize(LocationInfo targetLocation, AspectInfo aspectInfo)
  {
    //base.CompileTimeInitialize(targetLocation, aspectInfo);
  }

  #region <<< Public methods >>>
  public Object CreateInstance(AdviceArgs adviceArgs)
  {
    return MemberwiseClone();
  }

  public override void OnGetValue(LocationInterceptionArgs args)
  {
    //args.
    //base.OnGetValue(args);
  }

  public override void OnSetValue(LocationInterceptionArgs args)
  {
    //base.OnSetValue(args);
  }

  public void RuntimeInitializeInstance()
  {
  }
  #endregion
}