gpt4 book ai didi

c# - 在 F# 中声明私有(private)静态成员?

转载 作者:行者123 更新时间:2023-11-30 18:54:15 24 4
gpt4 key购买 nike

我决定将下面的 C# 类移植到 F# 作为练习。

很难。我只注意到三个问题

1)问候可见2) 我不能让 v 成为静态类变量3) 我不知道如何在构造函数中设置问候成员。

我该如何解决这些问题?代码应该足够相似,我不需要更改任何 C# 源代码。仅 ATM Test1.v = 21;不工作

C#

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace CsFsTest
{
class Program
{
static void Main(string[] args)
{
Test1.hi("stu");
new Test1().hi();
Test1.v = 21;
var a = new Test1("Stan");
a.hi();
a.a = 9;

Console.WriteLine("v = {0} {1} {2}", a.a, a.b, a.NotSTATIC());
}
}
class Test1
{
public int a;
public int b { get { return a * 2; } }
string greet = "User";
public static int v;

public Test1() {}
public Test1(string name) { greet = name; }

public static void hi(string greet) { Console.WriteLine("Hi {0}", greet); }
public void hi() { Console.WriteLine("Hi {0} #{1}", greet, v); }
public int NotSTATIC() { return v; }
}
}

F#

namespace CsFsTest

type Test1 =
(*
public int a;
public int b { get { return a * 2; } }
string greet = "User";
public static int v;
*)
[<DefaultValue>]
val mutable a : int
member x.b = x.a * 2
member x.greet = "User" (*!! Needs to be private *)

[<DefaultValue>]
val mutable v : int (*!! Needs to be static *)

(*
public Test1() {}
public Test1(string name) { greet = name; }
*)
new () = {}
new (name) = { }

(*
public static void hi(string greet) { Console.WriteLine("Hi {0}", greet); }
public void hi() { Console.WriteLine("Hi {0} #{1}", greet, v); }
public int NotSTATIC() { return v; }
*)
static member hi(greet) =
printfn "hi %s" greet
member x.hi() =
printfn "hi %s #%i" x.greet x.v
member x.NotSTATIC() =
x.v

最佳答案

F# 语言有一些结构在 C# 中没有任何等效结构,但它几乎具有您可以在 C# 中使用的所有内容。这意味着如果您只是将代码从 C# 转换为 F#,您最终将只使用 F# 的一个子集。因此,有时寻找一些特定的 F# 结构会更好。

我想静态成员也是如此。除了类之外,您还可以使用模块组织 F# 代码,模块提供了一种声明静态数据和函数的自然方式。这是问候语模块的示例:

// modules are automatically 'static' (from the C# point of viedw)
module Greetings =
// public mutable field inside a module
let mutable how = "Hello "
// global function that uses the field
let greet name =
Console.WriteLine(how + name)

// modify the global field and invoke global function
Greetings.how <- "Ahoj "
Greetings.greet("Tomas")

如果您需要一些静态功能和一些实例功能,通常很容易在模块和标准类之间拆分功能。明显的好处是它使您的语法更简单,但它也可能有助于构建代码:

type Person(name) =
member GreetMe() =
Greetings.greet(name)

模块内的成员可以声明为 privateinternal 如果你想对用户隐藏它们。例如,如果您想让 how 字段只能由您的程序集访问,您可以这样写:

let mutable internal how = "Hello "  

我认为这会为您提供更多地道的 F# 代码,因此在编写 F# 代码时我可能更喜欢这种编程风格。如果您打算从 C# 中使用它,那么模块将显示为静态类,这也很容易使用。

作为旁注,通常建议避免使用太多可变成员。但是,如果您将它们用于某种配置,那么我认为没问题。

关于c# - 在 F# 中声明私有(private)静态成员?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2618998/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com