所以这就是我想要做的.
我正在创建一个泛型类,它以两种方式之一分配泛型参数指定的类型,由使用哪个重载构造函数决定.
这是一个例子:
class MyClass<T>
where T : class
{
public delegate T Allocator();
public MyClass()
{
obj = new T();
}
public MyClass( Allocator alloc )
{
obj = alloc();
}
T obj;
}
Run Code Online (Sandbox Code Playgroud)
此类要求类型T在所有情况下都是reftype.对于默认构造函数,我们希望通过其默认构造函数实例化T.我想where T : new()在我的默认构造函数上添加一个,如下所示:
public MyClass()
where T : new()
{
obj = new T();
}
Run Code Online (Sandbox Code Playgroud)
但是,这不是有效的C#.基本上我只想在类型T上添加约束,只有在使用MyClass()的默认构造函数时才有默认构造函数.
在MyClass的第二个构造函数中,我们让用户确定如何使用自己的分配方法为T分配,所以很明显,MyClass在所有情况下都不能强制执行T是默认构造.
我有一种感觉,我需要在默认构造函数中使用反射,但我希望不会.
我知道这可以做到,因为Lazy<T>.NET 4.0中的类不要求T在类级别上是默认可构造的,但它的构造函数与我的示例中的构造函数类似.我想知道Lazy<T>它至少是怎么回事.
我目前有一个后台线程。在这个线程中是一个无限循环。
这个循环偶尔会更新数据库中的一些值,然后在 MessageQueue 上侦听 1 秒(使用queue.Receive(TimeSpan.FromSeconds(1)))。
只要没有消息进来,这个调用就会在内部抛出一个 MessageQueueException (Timeout),它被捕获,然后循环继续。如果有消息,调用通常会返回并处理消息,然后循环继续。
这会导致很多第一次机会异常(每秒一次,除非有消息要处理)并且这会导致调试输出垃圾邮件,并且当我忘记排除 MessageQueueExceptions 时也会在调试器中中断。
那么 MessageQueue 的异步处理意味着如何正确完成,同时仍然确保,只要我的应用程序运行,队列就会受到监控,并且数据库也会不时更新。当然这里的线程不应该占用100%的CPU。
我只需要大图或对正确完成异步处理的提示。
我试图在f#中实现我已经在c#中使用的东西,看看语法是多么简洁.我使用期权定价公式(黑色76)作为测试,因为这对我来说似乎是一个功能问题.一切似乎都很好,但我无法计算隐含的卷,因为我需要从内部调用同一个类的方法.这是我到目前为止:
module Module1
open System
type Black76 (CallPutFlag, Fwd, Strike, time, rf, vol, ?BlackPrice:float) =
let d1 = (Math.Log(Fwd / Strike) + (vol * vol * 0.5) * time) / (vol * Math.Sqrt(time))
let d2 = d1 - vol * Math.Sqrt(time)
let n = new MathNet.Numerics.Distributions.Normal()
member x.valuation =
match CallPutFlag with
| "c" | "C" | "Call" | "call" -> Math.Exp(-rf * time) * (Fwd * n.InverseCumulativeDistribution(d1) - Strike * n.InverseCumulativeDistribution(d2))
| "p" | "P" | "Put" | "put" …Run Code Online (Sandbox Code Playgroud)