我正在尝试动态创建代理类.我知道有一些非常好的框架可以做到这一点,但这纯粹是一个宠物项目作为一个学习练习,所以我想自己做.
例如,如果我有以下类实现接口:
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?
出于好奇,我试图测试List<T>
使用两者value
和reference
类型的性能.
结果并不像我预期的那样,让我相信我对这些对象在内存中如何布局的理解可能不正确.
这是我的实验:
创建一个class
只包含两个成员的基本,a int
和abool
创建2个List<T>
对象来保存我的测试类(List1
和List2
)
随机生成的测试对象并将其添加到List1
和List2
交替
时间迭代需要多长时间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) 我一直在阅读.NET中的垃圾收集和内存管理.我想问以下内容来检查我的理解:
假设我有一个在应用程序开始时创建的单例,它位于GC的第0代.然后想象我有另一个引用这个单例的类,并且在内存中也接近它(因为它也在第0代).推断它们可能位于同一缓存行中是否合理?
当应用程序运行时,GC会将对象提升到第1代,最终生成第2代.创建的任何新对象现在都可以远离内存中的单例.我是否正确地假设新对象之间的访问权限和单例可能会更慢,因为它们不能在同一个缓存行中?
GC是否会尝试将内存中彼此经常访问的对象保持在内存中更近距离?
我不打算尝试优化代码或第二次猜测垃圾收集器,我意识到这是一个人为的例子.我只关心GC如何使用内存以及CPU缓存如何工作的理论.
我无法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默认模型绑定,如果是这样,我在这里做错了什么?
我需要使用对Web服务的AJAX请求将大量16位整数传输到客户端.该阵列本质上是具有一些额外元数据的图像的灰度像素数据.
原始图像采用浏览器不支持的专有格式.典型图像为2000px x 4000px,因此阵列可包含8,000,000+ 16位值.
是否可以制作一个AJAX请求并在一个响应中返回整个数组,还是应该分成更小的块并单独请求每个?如果在一个响应中传输整个数组是公认的做法,我是否必须在请求期间处理不可靠的连接(或者在浏览器中是否"开箱即用")?
我们正在编写客户端和Web服务,因此我们对方法完全灵活.
c# ×4
.net ×2
arrays ×1
caching ×1
clr ×1
cpu ×1
javascript ×1
nancy ×1
prefetch ×1
proxy ×1
reflection ×1
struct ×1
web-services ×1