【问题标题】:Writing this AWS C# code snippet in F#在 F# 中编写此 AWS C# 代码片段
【发布时间】:2017-03-19 18:57:54
【问题描述】:

我是 F# 新手,只是想知道如何在 F# 中编写以下 C# 代码?

// Issue request and remember to dispose of the response
using (GetObjectResponse response = client.GetObject(request))
{
    using (StreamReader reader = new StreamReader(response.ResponseStream))
    {
        string contents = reader.ReadToEnd();
        Console.WriteLine("Object - " + response.Key);
        Console.WriteLine(" Version Id - " + response.VersionId);
        Console.WriteLine(" Contents - " + contents);
    }
}

我已经阅读了使用 use 的文档并想出了这个:

    use response = s3Client.GetObject(req)
    (
      use reader = new StreamReader(response.ResponseStream)
      urlCheck = reader.ReadToEnd())
      Console.WriteLine(urlCheck)

但它根本不起作用。有人可以帮忙吗?

编辑
我使用此链接:f# keyword use and using 作为上述解决方案的模板,但它不起作用。

我得到的错误是“阅读器不是函数,不能应用”。

另外,我知道我可以将它留在 C# 中,但我想看看我是否可以将它移植到 F#。对此的任何建议将不胜感激。

【问题讨论】:

  • 混合语言没有错,也许只是把它留在C#中
  • “不工作”通常是描述您的问题的糟糕方式 - 会发生什么?你有错误吗? (如果是这样,请告诉我们错误)。您是否得到了意想不到的回应(如果有,请描述预期和实际结果)
  • 我在上面做了修改。
  • 带有 urlCheck = reader.ReadToEnd() 的那一行,也许你的意思是“让 urlCheck = ...”,因为现在它变成了布尔测试。
  • 在 F# 中,我们几乎不会像这样用括号缩进“使用”。收益微乎其微,不值得牺牲可读性。

标签: c# f# c#-to-f#


【解决方案1】:

F# 中的 use 关键字与 C# 中的 using 的机制略有不同。一个主要区别是,在 C# 中,您使用花括号显式指定 using 的范围,但 F# 的 use 影响整个“当前块”(let-binding 或成员),从 use 到结束。这样您就不必显式地“嵌套”(即缩进)use“下”的代码。像往常一样继续写吧:

use response = s3Client.GetObject(req)
use reader = new StreamReader(response.ResponseStream)
let urlCheck = reader.ReadToEnd()
Console.WriteLine(urlCheck)

【讨论】:

  • 您好 Fyodor,非常感谢 - 它解决了一些问题 - 但是,当我打印 urlCheck 的内容时 - 编码完全错误,我不太清楚为什么。应该打印什么:{AmazonId2 = ContentLength = 1138630L; ... } 但是,我得到了“胡言乱语”。这更像是 AWS 的事情还是 F# 的事情?
  • 看看 C# 等价物,除了默认情况下,它似乎不需要任何其他特殊编码 - 这很奇怪!
  • 长镜头:在 C# 版本中,响应被声明为 GetObjectResponse。 s3Client.GetObject(req) 是否有可能不返回该编译时类型?我在想也许 response 然后得到错误的编译时间类型,然后这又会影响下一行调用哪个 response.ResponseStream 。验证推断的响应类型确实是 GetObjectResponse。
  • 您正在向控制台输入输出。这可能会阻止您在字符串中看到有趣的内容。至于编码,不要相信默认与C#中的一样,所以请尝试显式设置其他编码。
  • @BentTranberg 尝试了你所说的一切——它是 GetObjectResponse 的一种。还尝试更改编码 - 只是不工作!将有更多的玩弄它!感谢您的帮助。
猜你喜欢
  • 2010-12-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多