0

在应用程序中工作,并为异常列出了以下扩展方法:

public static void FillData(this Exception target, object data)
{
   if (target == null)
      throw new ArgumentNullException("target");
   if (data == null)
      throw new ArgumentNullException("data");

   string stackTraceSite = target.LastStackTraceSite();
   var stringDict = new System.Collections.Specialized.StringDictionary();

   PropertyInfo[] pis = data.GetType().GetProperties();
   int pisLen = pis.Length;

   for (int i = 0; i < pisLen; i++)
   {
      string key = (stackTraceSite != null ? stackTraceSite + '.' : null) + pis[i].Name;
      try
      {
         target.Data[key] = pis[i].GetValue(data, null) ?? "null";
      }
      catch (ArgumentException ae)
      {
         target.Data[key] = "ARGUMENT EXCEPTION -> " + ae.Message;
      }
   }
}

然后以类似的方式调用或使用它:

try
{
   // Perform some dangerous operation that throws an exception
}
catch (Exception ex)
{
   ex.FillData(new { CustId = 4, Category = "Foo", Style = "bar" });
   Logger.LogError(ex);
}

匿名类型的成员(如示例中所示)在某些情况下被“重用”,但在许多其他情况下,它们完全不同。(例如new { FileType = Enum.FileType.RejectionLetter, FilePath = loadFilePath }

这种代码在很多地方和一个会获得大量流量的网络应用程序中使用。我想知道的一个问题是:所有这些匿名类的定义最终会陷入困境/崩溃/创建一个即使/当它们没有被捕获时,显着的内存负载?

4

1 回答 1

1

如果属性名称集相同,则类型将被重用。

class Program
{
    static void Main(string[] args)
    {

        var test = new Test();
        var inner = test.Go();
        var anonObj = new { Name = "one" };
        Console.WriteLine(inner == anonObj.GetType()); // true
    }
}

public class Test
{
    public Type Go()
    {
        var anonObj = new { Name = "one" };
        return anonObj.GetType();
    }
}

因此,您不会遇到具有相同属性集的多个调用的问题。但是定义本身呢?我写了一个快速实验,看看会发生什么。

class Program
{
    static void Main(string[] args)
    {

        new Test().Go();
        Console.WriteLine("End: " + GC.GetTotalMemory(true));
        Console.ReadLine();
    }
}

public class Test
{
    public void Go()
    {
        var anonObj = new { Name = "one" };
        Console.WriteLine(GC.GetTotalMemory(true));
    }
}

声明 anon 类型后,内存使用率更高,即使在所有引用都消失并收集垃圾之后,所以我假设类型定义在 GC 之后确实存在,因此在 AppDomain 的生命周期中存在。所以理论上,这可能是个问题。

但是,它只会为属性的唯一组合创建类型,因此除非这是一个非常大的代码库,否则它不会引起任何问题。

埃里克

于 2013-05-23T20:24:14.973 回答