【问题标题】:Performance penalty for not declaring variables不声明变量的性能损失
【发布时间】:2020-04-28 01:42:29
【问题描述】:

最近我在开发中进行了几个小练习。在其中一个中,我被要求在 VB .NET 中根据当前语言环境将字符串转换为数字。所以我做到了:

Imports System

Public Module Aplicacion
    Public Sub Main()
        Console.WriteLine(Numero("Hello World"))
        Console.WriteLine(Numero(2))
        Console.WriteLine(Numero(.24))
        Console.WriteLine(Numero(2.4))
    End Sub
    Function Numero(input as String) AS Double
        Try
            return Convert.ToDouble(input)
        Catch Ex AS Exception
            return 0    
        End Try
    End Function
End Module

老师纠正了这个问题,告诉我“虽然它有效,但正确的方法是声明一个与我要返回的类型相同的变量,在函数体中计算它的值最后返回这个变量”。

相对于像我那样直接这样做,这样做真的有什么好处吗? 也许是一些编译奖励或性能改进?

【问题讨论】:

  • 但是如果性能真的很重要,你根本不应该使用异常(异常很昂贵!)。而是使用Double.TryParse 并明确传入CultureInfo.CurrentCulture 来表明您尊重用户当前文化设置的意图。完全避免使用System.Convert 类。
  • 它“可能”会变得更糟,就像您在驾驶时“可能”通过在您的口袋里额外增加 1 公斤的重量来让您的车跑得更慢一样:这完全是微不足道的影响 这将与更重要的事情相形见绌(以此类推,比如在你的车里搭载一名 70 公斤以上的乘客)——在你的情况下,使用 TryParse 而不是 Convert 会产生更大的影响。
  • 如果您不声明和使用返回变量,VB 编译器会发出一个返回变量。这是 pre-Net VB Function 语法工作方式的产物,您将返回值分配给与函数名称相同的隐式变量;请注意,此语法仍然有效。如果您单步执行函数并将鼠标悬停在函数名称上并查看值,则可以在调试器中看到 this 的效果。
  • @MatiasBarrios - 如果您在 VB.NET 中编码,我能给您的最大提示是将 Option Strict On 放在代码的顶部。它会迫使你成为一个更好的程序员。立即在您的代码上试用。
  • 这与性能无关。这是关于编码风格和最佳实践的。有些人认为在方法中设置一个退出点是正确的做法。我曾经在那个营地。我从不信奉它,但随着时间的推移,我越来越倾向于尽快退出一种方法。拥有多个退出点可以减少缩进,从而提高代码的可读性。如果您的老师希望您有一个出口点并相应地标记,那么您应该为全班这样做,但要注意这不是一种正确的方法。只要符合逻辑和一致。

标签: vb.net


【解决方案1】:
Function Numero(input As Object)
    If input.GetType Is GetType(String) Then
        Return 0
    Else
        Return input
    End If
End Function

Sub Main()
    Console.WriteLine(Numero("$$$$325FK-.,ASL$$$"))
    Console.WriteLine(Numero(1))
    Console.WriteLine(Numero(1.5))
    Console.ReadKey()
End Sub

【讨论】:

  • 请解释您的解决方案是做什么的以及它是如何工作的。目前这不是一个很好的答案。
  • 他想提高这个函数的速度,使用 If 语句是最快的解决方案如果找到字符串返回 0 否则返回输入这是正确的方法,而不是他使用 Catch 返回 0...
猜你喜欢
  • 2011-04-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-04-10
  • 1970-01-01
  • 2012-05-31
  • 1970-01-01
相关资源
最近更新 更多