2

我有一个连接到 WCF 服务的客户端应用程序,我从服务器获取文件大小作为一个long值,然后在客户端将其转换为string它看起来像 ex:52.21 MB

每次用户更改当前目录路径时,应用程序都会获得过多的文件大小。

我的问题:我应该将值从WCF 服务应用程序string转换为格式,然后将其作为 a 返回给客户端,还是应该将大小作为值返回并让客户端将其转换为格式stringlongstring

以其他方式,哪个值在内存中占用更多字节:

long size = 55050240;
string size = "52.5 MB"; 

long large_size = 56371445760;
string large_size = "52.5 GB";

更新:

我使用这种方法将 long 值转换为字符串格式:

private string ConvertUnit(long source)
    {
        const int byteConversion = 1024;
        double bytes = Convert.ToDouble(source);

        if (bytes >= Math.Pow(byteConversion, 3)) //GB Range
        {
            return string.Concat(Math.Round(bytes / Math.Pow(byteConversion, 3), 2), " GB");
        }
        else if (bytes >= Math.Pow(byteConversion, 2)) //MB Range
        {
            return string.Concat(Math.Round(bytes / Math.Pow(byteConversion, 2), 2), " MB");
        }
        else if (bytes >= byteConversion) //KB Range
        {
            return string.Concat(Math.Round(bytes / byteConversion, 2), " KB");
        }
        else //Bytes
        {
            return string.Concat(bytes, " Bytes");
        }
    }

简短的问题:哪个需要更多的内存、string价值或long价值?

4

3 回答 3

5

“哪个需要更多内存,字符串值或长值”

C# 中的字符串是 Unicode 字符(每个字符是两个字节)+ 指向该地址的指针(最少 4 个字节,在 x64 .NET 应用程序上为 8 个字节)。

Long 是 8 个字节。一旦您在 x86 上超过 2 个字符,或者在 x64 上超过任何字符,您将占用比 long 更多的内存。

但是,字符串是不可变的,如果您要发送大量相同大小的文件,字符串最终会消耗更少的内存。

对于您的实际问题,您应该使用 long 来真正表示底层对象。

编辑:更正以考虑字符串的指针大小。

于 2012-04-16T10:23:11.820 回答
4

拥有一个输出格式化值的服务层是一个非常糟糕的主意。如果需求发生变化,而不是GB后缀,客户端应用程序 UI 需要以字节为单位输出,会发生什么情况?例如56,371,445,760?这将需要客户端应用程序解析然后重新格式化服务器发送的数据。

此外,确定存储单个变量所需的内存也很容易。不太容易计算出对您的应用程序的整体影响。不同的类型将在您的代码中以不同的方式处理,因此较小的变量可能会产生更大的成本。

于 2012-04-16T10:22:19.927 回答
3

.NET 字符串是 UTF-16 代码单元的数组,每个 2 字节长。因此,“52.5 MB”将占用 7*2=14 个字节,即使忽略对字符串的引用(4 或 8 个字节,具体取决于进程“位”)和字符串长度等辅助字段。是long8 个字节,所以很明显这个字符串“更胖”了。

此外,您的示例没有传达相同的信息(您正在失去字符串中的“精度”),因此就像比较苹果和橙子一样。

即使在 SOAP 消息中编码,long 也应该比 string 更紧凑。

由于所有这些原因,我会选择long.

于 2012-04-16T10:24:10.333 回答