我有一个连接到WCF服务的客户端应用程序,我从服务器获取文件大小为long
值然后我在客户端将其转换为string
所以它看起来像ex: 52.21 MB
每次用户更改当前目录路径时,应用程序都会获得太多文件大小。
我的问题:我应该从 WCF服务应用将值转换为string
格式,然后将其作为string
返回给客户端或者我应该只返回long
值的大小,让客户端将其转换为string
格式
换句话说,哪个值在内存中占用更多字节:
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
值?
答案 0 :(得分:5)
“哪个需要更多内存,字符串值或长值”
C#中的字符串是unicode字符(每个字符是两个字节)+指向该地址的指针(x64 .net应用程序中最少4个字节,8个字节)。
长是8个字节。一旦你在x86上超过2个字符,或者x64上的任何字符,你将占用更多的内存而不是长。
字符串是不可变的,如果你发送了大量符合规格的文件,字符串最终会占用更少的内存。
对于您的实际问题,您应该使用long来真正表示基础对象。
编辑: 已更正,以考虑字符串的指针大小。
答案 1 :(得分:4)
拥有一个输出格式化值的服务层是一个非常糟糕的主意。如果需求发生变化而不是 GB 后缀,客户端应用程序UI需要以字节为单位输出会发生什么?例如56,371,445,760
?这将要求客户端应用程序解析然后重新格式化服务器发送的数据。
此外,确定存储单个变量所需的内存很容易。不那么容易的是找出对您的应用程序的整体影响。在您的代码中,不同类型的处理方式会有所不同,因此较小的变量可能会产生更高的成本。
答案 2 :(得分:1)
.NET字符串是UTF-16代码单元的数组,每个字节长2个字节。因此,“52.5 MB”将占用7 * 2 = 14个字节,甚至忽略对字符串的引用(4或8个字节,取决于进程“bit-ness”)和辅助字段,如字符串长度。 long
是8个字节,因此很明显字符串更“胖”。
此外,您的示例不会传达相同的信息(您在字符串中丢失“精度”),因此它就像比较苹果和橙子。
即使在SOAP消息中编码,long也应该比string更紧凑。
由于所有这些原因,我会选择long
。