【问题标题】:How do I fix the long to string and string to double conversion cleanly?如何干净地修复 long to string 和 string to double 转换?
【发布时间】:2014-04-10 23:31:46
【问题描述】:

我正在尝试修复两个警告。第一个警告是 oInfo.Length 上从 long 到 string 的隐式转换。第二个是“strSize”上从字符串到双精度的隐式转换。这是一个旧的 .NET 1 项目,我正在尝试转换为 4.0。如何在保持逻辑的同时修复这些警告?

 Dim oInfo As New System.IO.FileInfo(Server.MapPath(strVirtualPath))
    Dim strSize As String = ""
    Try
        If oInfo.Exists Then
            strSize = **oInfo.Length**
            If **strSize** < 1048576 Then
                strSize = System.Math.Round(Convert.ToInt64(strSize) / 1024, 2) & " kb"
            Else
                strSize = System.Math.Round(Convert.ToInt64(strSize) / 1048576, 2) & " mb"
            End If
        End If
    Catch ex As Exception

【问题讨论】:

标签: vb.net


【解决方案1】:

类似于以下内容。请注意,如果它是一个数字,它应该存储在为 numbers 设计的数据类型中。 只有一个数字应该存储在字符串中的时间是为了显示目的(例如逗号分隔、单位等)

Dim FInfo As New System.IO.FileInfo(Server.MapPath(strVirtualPath))
Dim Result As String
Try
    If oInfo.Exists Then
        Dim FileSize = FInfo.Length
        If FileSize < 1048576 Then
            Result = System.Math.Round(FileSize / 1024, 2) & " kb"
        Else
            Result = System.Math.Round(FileSize / 1048576, 2) & " mb"
        End If
    End If
Catch ex As Exception
    ....

请注意,这仍然不够(除非您知道您永远不会得到小于 1KB 或大于 1GB 的文件)。一个更好的解决方案可以是found here

编辑:响应 André Figueiredo... FileInfo.Length 定义为:

Public ReadOnly Property Length() As Long
    <SecuritySafeCritical()>
    Get
        If Me._dataInitialised = -1 Then
            MyBase.Refresh()
        End If
        If Me._dataInitialised <> 0 Then
            __Error.WinIOError(Me._dataInitialised, MyBase.DisplayPath)
        End If
        If(Me._data.fileAttributes And 16) <> 0 Then
            __Error.WinIOError(2, MyBase.DisplayPath)
        End If
        Return CLng(Me._data.fileSizeHigh) << 32 Or (CLng(Me._data.fileSizeLow) And CLng((CULng(-1))))
    End Get
End Property

_dataInitialised 似乎是由(本机)基类设置的,所以我看不到它何时设置。人们希望它正在建设中,但似乎并非如此,因为它已在许多地方进行了检查。

当然,这一切都没有实际意义,因为 OP 似乎在使用 Option Strict = False,由于所有类型检查,这会增加约 30% 的性能损失。

【讨论】:

    【解决方案2】:

    oInfo.Length 指的是System.IO.FileInfo.Length,是一个long。

    因此,您不能将 strSize 播放一次为Long,另一次播放为String

    事实上,您甚至不需要将oInfo.Length 存储到另一个变量中。它在对象创建中填充(当 FileInfo 从文件中检索信息时)。这样做,您不需要将值转换为 Long。

    我会将这段代码重写为:

    Dim oInfo As New System.IO.FileInfo(Server.MapPath(strVirtualPath))
    Dim strSize As String = ""
    
    Try
        If oInfo.Exists Then
            If oInfo.Length < 1048576 Then
                strSize = System.Math.Round(oInfo.Length / 1024, 2) & " KB"
            Else
                strSize = System.Math.Round(oInfo.Length / 1024 / 1024, 2) & " MB"
            End If
        End If
    Catch ex As Exception
    

    【讨论】:

    • ...System.IO.FileInfo.Length, which is a double. 不......这是一个长篇(如您链接的页面所示)。将长度存储在变量中的原因是为了避免两次查询文件系统
    • @Basic,关于查询系统两次.. 不,这是错误的.. FileInfo 属性是通过在创建对象时查询系统来填充的。之后,它将值存储在变量oInfo 中。即,如果文件大小在两次调用 Length 之间发生变化,应用程序不会知道这一点,并且仍会通知旧值。
    • @AndréFigueiredo 实际上,我们都部分正确。如果它已经初始化,它不会从磁盘读取,但有一些开销......我已经把它实际做的事情放到我的回答
    【解决方案3】:

    从这里开始:

    Dim strSize As Double
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-05-17
      • 2011-10-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多