我刚开始使用F#,这是我的第一个功能语言.我一直在使用C#进行准独家工作,并且很享受F#引导我重新思考如何编写代码.我觉得有点迷惑的一个方面是编写代码的过程发生了变化.我现在已经在C#中使用TDD多年了,非常感谢有单元测试知道我在哪里.
到目前为止,我用F#过程中一直写一些功能,和他们一起玩与交互式控制台,直到我在"合理"确保他们的工作,并调整与合并.这适用于像欧拉项目这样的小规模问题,但我无法想象以这种方式构建大的东西.
人们如何进行单元测试并为F#程序构建测试套件?是否有相当于TDD?任何指针或想法都表示赞赏.
我一直在尝试遵循StyleCop关于项目的指导原则,看看最终的代码是否更好.大多数规则都是合理的,或者是关于编码标准的意见问题,但有一条规则让我感到困惑,因为我没有看到其他人推荐它,而且因为我没有看到明显的好处:
SA1101:对{method或property name}的调用必须以'this'开头.前缀表示该项是该类的成员.
在缺点方面,代码显然更加冗长,遵循该规则有什么好处?这里有人遵循这条规则吗?
我听说任务并行库可以在.Net 3.5项目中使用.这是否正确,如果是,我该如何使用它?在.Net 4.0中,它驻留在System.Threading中,但是当我在Visual Studio 2010中选择.Net 3.5作为目标时,我无法访问Parallel和Parallel循环等类.
一旦将控件添加到WPF网格,有没有办法通过行和/或列索引以编程方式访问它们?有点像:
var myControl = (object)MyGrid.GetChild(int row, int column);
Run Code Online (Sandbox Code Playgroud)
... GetChild
我希望我拥有的方法在哪里!
我终于忍受了Dependency Injection(早就应该); 我开始玩Unity并遇到战略模式的问题.我可以使用容器向我返回基于名称的策略的特定实现,但我没有看到我应该如何在上下文中获得正确的策略.
让我们举一个简单的例子说明:上下文是一辆汽车,它有一个IEngine(策略),有2个实现,FastEngine和SlowEngine.代码将沿着这些方向看:
public interface IEngine
{
double MaxSpeed
{
get;
}
}
internal class FastEngine:IEngine
{
public double MaxSpeed
{
get
{
return 100d;
}
}
}
internal class SlowEngine:IEngine
{
public double MaxSpeed
{
get
{
return 10d;
}
}
}
public class Car
{
private IEngine engine;
public double MaximumSpeed
{
get
{
return this.engine.MaxSpeed;
}
}
public Car(IEngine engine)
{
this.engine = engine;
}
}
Run Code Online (Sandbox Code Playgroud)
我的问题如下:我应该如何实例化快车或慢车?我可以使用容器为我提供每个实现,我可以设置一个"默认"实现来使用:
IUnityContainer container = new UnityContainer();
container.RegisterType<IEngine, FastEngine>();
container.RegisterType<IEngine, FastEngine>("Fast"); …
Run Code Online (Sandbox Code Playgroud) c# dependency-injection ioc-container unity-container strategy-pattern
假设我想创建一个表示可接受的最小/最大边界的记录类型:
type Bounds = { Min: float; Max: float }
Run Code Online (Sandbox Code Playgroud)
有没有办法强制执行Min <Max?编写validateBounds函数很容易,我只是想知道是否有更好的方法来执行此操作.
编辑:我意识到,对于这个具体的例子,我可能会放弃暴露两个属性并重新排序参数,所以让我们说我们试图做
type Person = { Name: string }
Run Code Online (Sandbox Code Playgroud)
和名称需要至少有一个字符.
虽然没有一个真正正确的风格,但C#社区中存在一些关于编码标准/风格的普遍一致意见; 通常,它们是.NET Framework设计指南的变体.
但是,当你研究F#时,标准明显不同于C#中的正常标准.作为一个例子,List或Seq上可访问的函数(几乎)都以小写字母开头:List.fold,List.map(但List.Cons和List.Empty不...),而通常接受的是C#中的方法或属性应该大写.
所以我的问题是,F#有广泛接受的编码约定吗?是否有相当于框架设计指南,或那里的良好编码标准?而且,作为奖励,在基于空白的F#世界中,人们是否有无休止争论的主题,类似于永恒的C#花括号位置?
我有一个功能应用程序有3个功能,其中一个定时器每2分钟触发一次.我观察到一段时间后,该函数停止被触发,但是当我进入门户时重新启动.
据我了解,原因是默认情况下,"Always On"已关闭.但是,当我转到应用程序设置/常规设置时,我无法激活灰色的"开启"状态.我可以取消选中"关闭",这似乎不会粘住或激活"开启".
我错过了一些明显的东西吗 是永远 - 解决我的问题的解决方案,还是我应该做的其他事情?
注意:函数是用F#编写的; 我怀疑这很重要,但我想我会提到它以防万一.
假设以下F#函数:
let f (x:int) (y:int) = 42
Run Code Online (Sandbox Code Playgroud)
我怀疑我需要在下面的示例z2中括起参数的原因是因为类型推断; 我的例子可能不太好,但很容易想象事情会变得多毛:
let z1 = f 2 3
let z2 = f 2 (f 3 5)
Run Code Online (Sandbox Code Playgroud)
但是,以下案例对我来说不太清楚:
let rng = System.Random()
let z3 = f 1 rng.Next(5)
Run Code Online (Sandbox Code Playgroud)
z3不起作用,带有明确的错误消息:
错误FS0597:连续参数应该用空格或元组分隔,涉及函数或方法应用程序的参数应该用括号括起来.
修复它是微不足道的(括号所有的东西),但我不清楚的是为什么这样的表达式是一个问题.我认为这再次与类型推断有关,但是天真地,在我看来,在这里,具有由括号括起来的参数列表的方法实际上会使事情变得不那么模糊.这与rng.Next(5)
等同的事实有关rng.Next 5
吗?
有人可以暗示,举例或解释为什么需要这个规则,或者如果不存在会出现什么类型的问题?