用oop风格编写F#代码

时间:2015-03-17 07:51:52

标签: c# f#

我写了一个ip计算器库mixin功能和oop风格。

type IpAddr(file: string, loc: string) = 

    let location = queryIpLocation file loc
    let listRange = extractAddr location 


    member self.Calculate(addr :string) =
        validIp addr listRange

calculate方法返回记录类型:

type IpLoc =
     { ip : String
       subnet : String
       gateway : String }

然后我将库导入C#应用程序并想要使用类:

class Program
{
    static void Main(string[] args)
    {
        var calc = new IpAddr(@"C:\Temp\file.xml", "xxxxxxx");
        var ip = calc.Calculate("xxx.xxx.xxx.xxx");
        Console.WriteLine(ip);
        Console.ReadLine();
    }
}

calculate方法返回类型为IpLoc的选项对象。现在我不知道如何在C#中处理选项对象。

我的目标是,在f#和gui wpf中为我的公司编写.net应用程序库,基于C#。为什么不只在C#中, 因为我想发现f#的强大功能,但这样做是个好主意吗?

2 个答案:

答案 0 :(得分:2)

首先,我认为使用F#编写进行计算的库然后将其包装在可以从WPF应用程序中使用的C#友好API中是一个好主意。

我认为问题是Calculate的结果是option<IpLoc>。 通常,您可以找到一些处理来自C#的选项值的方法。这不是太难(如果你是唯一一个编写代码的人,可能是一个很好的选择)。但是,C#通常不会使用选项,所以你也可以将代码包装成惯用的C#。

您可以使用Unchecked.defaultof返回null。从F#的角度来看,这很危险,但有时它是C#代码所期望的:

  member x.Calculate(b) =
    match valueIp b with
    | Some v -> v
    | None -> Unchecked.defaultof<_>

另一种选择是创建一个返回bool的方法,并通过out参数返回该值。这类似于Int32.TryParse的工作方式:

  member x.Calculate(b, [<System.Runtime.InteropServices.Out>] ipLoc:byref<_>) =
    match valueIp b with
    | Some v -> ipLoc <- v; true
    | None -> false

答案 1 :(得分:0)

如果您希望F#库与其他.NET语言交互,请查看此文档: "Guidelines for Libraries for Use from other .NET Languages"