小编Dav*_*e S的帖子

动态创建代理类

我正在尝试动态创建代理类.我知道有一些非常好的框架可以做到这一点,但这纯粹是一个宠物项目作为一个学习练习,所以我想自己做.

例如,如果我有以下类实现接口:

interface IMyInterface
{
    void MyProcedure();
}

class MyClass : IMyInterface
{
    void MyProcedure()
    {
        Console.WriteLine("Hello World");
    }
}
Run Code Online (Sandbox Code Playgroud)

为了拦截这个类的方法以便记录它们,我正在创建另一个类(我的代理类版本),它实现相同的接口但包含对"真实"类的引用.此类执行操作(例如,日志记录),然后在真实类上调用相同的方法.

例如:

class ProxyClass : IMyInterface
{
    private IMyInterface RealClass { get; set; }

    void MyProcedure()
    {
        // Log the call
        Console.WriteLine("Logging..");

        // Call the 'real' method
        RealClass.MyProcedure();
    }
}
Run Code Online (Sandbox Code Playgroud)

然后调用者调用代理类上的所有方法(我使用基本的home-brew IoC容器来注入代理类来代替真正的类).我正在使用此方法,因为我希望能够RealClass在运行时将其换出到另一个实现相同接口的类.

有没有办法ProxyClass在运行时创建并填充其RealClass属性,以便它可以用作真实类的代理?是否有一种简单的方法可以做到这一点,还是需要使用类似的东西Reflection.Emit并生成MSIL?

.net c# reflection proxy

36
推荐指数
1
解决办法
3万
查看次数

List <struct> vs List <class>的性能

出于好奇,我试图测试List<T>使用两者valuereference类型的性能.

结果并不像我预期的那样,让我相信我对这些对象在内存中如何布局的理解可能不正确.

这是我的实验:

  • 创建一个class只包含两个成员的基本,a int和abool

  • 创建2个List<T>对象来保存我的测试类(List1List2)

  • 随机生成的测试对象并将其添加到List1List2交替

  • 时间迭代需要多长时间List1(执行一些任意工作,例如递增计数器然后访问元素)

然后我重复了一个struct代替class

我的假设是,当使用a时class,其中的引用List<T>将是连续的,但由于我如何创建它们(在添加到List1和之间切换List2),它们指向的对象可能不会.

我认为当使用a时struct,因为它是一个值类型,所以对象本身将在内存中连续List<T>保持(因为它保存实际的项而不是引用的集合).

因此,我期望struct表现更好(由于预取器等...)

实际上,两者都非常相似.

这里发生了什么?

编辑 - 添加了实际访问迭代器中元素的代码,包括代码示例

测试类(或结构)

public class/struct TestClass
{
    public int TestInt;
    public bool TestBool;
}
Run Code Online (Sandbox Code Playgroud)

创建随机列表:

var list1 = new List<TestClass>();
var list2 = new List<TestClass>();

var …
Run Code Online (Sandbox Code Playgroud)

c# clr struct memory-management prefetch

8
推荐指数
2
解决办法
3083
查看次数

当应用程序运行的时间更长时,.NET单例的性能是否会降低?

我一直在阅读.NET中的垃圾收集和内存管理.我想问以下内容来检查我的理解:

假设我有一个在应用程序开始时创建的单例,它位于GC的第0代.然后想象我有另一个引用这个单例的类,并且在内存中也接近它(因为它也在第0代).推断它们可能位于同一缓存行中是否合理?

当应用程序运行时,GC会将对象提升到第1代,最终生成第2代.创建的任何新对象现在都可以远离内存中的单例.我是否正确地假设新对象之间的访问权限和单例可能会更慢,因为它们不能在同一个缓存行中?

GC是否会尝试将内存中彼此经常访问的对象保持在内存中更近距离?

我不打算尝试优化代码或第二次猜测垃圾收集器,我意识到这是一个人为的例子.我只关心GC如何使用内存以及CPU缓存如何工作的理论.

.net cpu caching garbage-collection

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

模型绑定到Nancy中的Dictionary <string,string>

我无法Dictionary<string,string>在Nancy中绑定JSON .

这条路线:

Get["testGet"] = _ =>
{
    var dictionary = new Dictionary<string, string>
    {
         {"hello", "world"},
         {"foo", "bar"}
    };

    return Response.AsJson(dictionary);
};
Run Code Online (Sandbox Code Playgroud)

按预期返回以下JSON:

{
    "hello": "world",
    "foo": "bar"
}
Run Code Online (Sandbox Code Playgroud)

当我尝试将这个确切的JSON发布回此路线时:

Post["testPost"] = _ =>
{
    var data = this.Bind<Dictionary<string, string>>();
    return null;
};
Run Code Online (Sandbox Code Playgroud)

我得到了例外:

值"[Hello,world]"不是"System.String"类型,不能在此通用集合中使用.

是否可以绑定到Dictionary<string,string>使用Nancys默认模型绑定,如果是这样,我在这里做错了什么?

c# model-binding nancy

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

将大型阵列传输到客户端

我需要使用对Web服务的AJAX请求将大量16位整数传输到客户端.该阵列本质上是具有一些额外元数据的图像的灰度像素数据.

原始图像采用浏览器不支持的专有格式.典型图像为2000px x 4000px,因此阵列可包含8,000,000+ 16位值.

是否可以制作一个AJAX请求并在一个响应中返回整个数组,还是应该分成更小的块并单独请求每个?如果在一个响应中传输整个数组是公认的做法,我是否必须在请求期间处理不可靠的连接(或者在浏览器中是否"开箱即用")?

我们正在编写客户端和Web服务,因此我们对方法完全灵活.

javascript c# arrays web-services

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