【问题标题】:Is it fine to pass a value returned by await function as parameters in C# [closed]将await函数返回的值作为C#中的参数传递是否可以[关闭]
【发布时间】:2021-03-01 17:57:25
【问题描述】:

我已经声明了一个字符串扩展方法来解码 Base64 字符串,例如:

        public static string DecodeFromBase64String(this string base64String)
        {
            return Encoding.UTF8.GetString(Convert.FromBase64String(base64String));
        }

现在有一个异步函数,它可以上传文件并返回其 id 的 base64 编码值。 如果我只是在参数中使用 await 传递这个函数是否可以,例如:

// Approach 1
var fileId = StringExtensions.DecodeFromBase64String( await uplodFile(FilePath) );

或者我应该只做一个两步过程,首先获取base64 id,然后在下一步解码它。这需要我声明两个具有有意义名称的变量,或者只是重用相同的变量

// Approach 2
var base64fileId = await uploadFile(FilePath); 
var fileId = StringExtensions.DecodeFromBase64String(base64fileId);

// Approach 3
var fileId = await uploadFile( Filepath); // at this step file Id doesn't make much sense, but reduces need of extra variable
fileId = StringExtensions.DecodeFromBase64String(fileId);

考虑到设计原则,您认为哪种方法最好。 我还在学习 C#,所以请原谅我的任何错误。

【问题讨论】:

  • 我的偏好是方法 2:a) 如果您需要对代码进行故障排除,将其拆分为两个表达式可以更轻松地单步执行调试器; b) C# 字符串是immutable - “fileId”和“base64fileId”将始终是独立且不同的 CLR 对象,因此您不妨给它们起不同的名称。

标签: c# .net-core design-principles


【解决方案1】:

您是在询问内联调用依赖函数是否“可以”,或者您是否需要临时变量。答案当然可以。

一种方式是否比另一种方式更具可读性可能值得商榷,但在您的具体示例中,我会说内联版本更具可读性,因为一目了然地解析的噪音和临时变量更少(假设您已阅读嘈杂的Encoding. 命名空间,并使用函数调用的=> 形式来减少噪音)。考虑一下:

    public static string DecodeFromBase64String(this string base64String) =>
        UTF8.GetString(Convert.FromBase64String(base64String));

对此有一点说明:

但减少了额外变量的需要

这对任何事情来说都是一个可怕的论据。生成的 IL 将使用堆栈进行该函数调用,生成的本机代码将根据需要使用寄存器。你只是无缘无故地让你的代码更难解析。

【讨论】:

  • 关于实际性能的另一件事是,解码该字符串的方式非常低效。不仅在处理能力方面,更重要的是在分配和 GC 压力方面,您分配了三个不同的对象(base64 字符串、数组和结果字符串,以及这些函数分配的任何其他内容)。您可以通过将base64 解码手写到StringBuilder 甚至更好的Span<char> 中轻松地将其减少到两个分配。虽然我无法想象你为什么要对一个实际的字符串进行 base64 编码,但只需按原样发送即可。
  • 其实uploadFile函数是第三方函数,所以需要解码。此外,解码功能有更多的检查,因为它是一个通用的字符串扩展方法,所以为了清楚问题,我简化了这个功能。我只是怀疑通过 await 内联是否可以。谢谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-04-15
  • 1970-01-01
  • 2010-12-14
  • 1970-01-01
  • 1970-01-01
  • 2020-02-19
  • 2013-11-13
相关资源
最近更新 更多