CSharp字符串使用技巧,如何减少内存分配?

2023-10-14 1767阅读

字符串可能是所有编程语言中最常用的基本数据类型。如果使用不慎,我们将为字符串操作带来的额外性能开销付出代价。确保将拳击运动保持在最低限度。避免分配额外的内存空间。事实上,Number.FormatInt32 方法是一个非托管方法,其原型如下:。因此,在将其他值引用类型转换为字符串并完成拼接时,应避免使用运算符“+”来完成,而应使用值引用类型提供的ToString()方法。当StringBuilder字符长度小于16时,StringBuilder不会重新分配内存; 当StringBuilder的长度大于16且小于32时,StringBuilder会重新分配内存,使其成为16的倍数。不要认为前者创建的字符串对象比后者少。string.Format方法内部使用StringBuilder来格式化字符串,如下代码所示:。双击,打开窗口,确保选项没有勾选;

CSharp字符串使用技巧,如何减少内存分配?

字符串可能是所有编程语言中最常用的基本数据类型。 如果使用不慎,我们将为字符串操作带来的额外性能开销付出代价。

因此,建议从两个方面探讨如何避免此类性能开销:

确保将拳击运动保持在最低限度。

避免分配额外的内存空间。

1、第一方面:请看下面两行代码:

CSharp字符串使用技巧,如何减少内存分配?

为了理解这两行代码的执行过程,我们来对比一下两者生成的IL代码。

第一行代码对应的IL代码如下:

CSharp字符串使用技巧,如何减少内存分配?

第二行代码对应的IL代码如下:

CSharp字符串使用技巧,如何减少内存分配?

CSharp字符串使用技巧,如何减少内存分配?

可以看到,第一行代码“str1”+10在运行时会完成一次装箱行为(IL代码中的装箱); 而第二行代码中的10.ToSTRing()则没有装箱行为。 实际上调用的是整数的 ToString() 方法。

Int32转字符串ToString方法的原型是:

CSharp字符串使用技巧,如何减少内存分配?

有人可能会问,原型中的Number.FormatInt32方法会产生装箱行为吗? 事实上,Number.FormatInt32 方法是一个非托管方法,其原型如下:

CSharp字符串使用技巧,如何减少内存分配?

它通过直接操作内容来完成int到string的转换,比装箱效率高很多。 因此,在将其他值引用类型转换为字符串并完成拼接时,应避免使用运算符“+”来完成,而应使用值引用类型提供的ToString()方法。

也许有人会提出疑问:上面给出的例子中,即使FCL提供的方法不存在装箱行为,那么其他情况下FCL方法内部会不会存在装箱行为呢? 答案是:也许会有。 不过,这里有一个指导原则:在您编写的代码中,您应该尽可能避免编写不必要的装箱代码。

请注意,装箱会造成性能损失,因为它需要完成以下三个步骤:

首先,在托管堆中为值类型分配内存。 总内存加上值类型本身分配的内存加上类型对象指针和同步块索引占用的内存。

将值类型的值复制到新分配的堆内存中。

返回已成为引用类型的对象的地址。

2、第二个方面:避免分配额外的内存空间。 对于CLR来说,字符串对象(string object)是一个非常特殊的对象。 一旦指定了值,就无法更改。 在运行时调用System.String类中的任何方法或执行任何操作(如“=”赋值、“+”连接等)都会在内存中创建一个新的字符串对象,这也意味着该new对象分配new内存空间。 像下面这样的代码会带来额外的运行时开销。

CSharp字符串使用技巧,如何减少内存分配?

CSharp字符串使用技巧,如何减少内存分配?

下面的代码中,运行时不会拼接字符串,而是编译时直接生成。

CSharp字符串使用技巧,如何减少内存分配?

由于使用System.String类在某些情况下会带来明显的性能损失,因此微软提供了另一种类型StringBuilder来弥补String的缺点。

StringBuilder 不会重新创建字符串对象。 它的效率来自于提前以非托管的方式分配内存。 如果StringBuilder没有先定义长度,则默认分配的长度为16。当StringBuilder字符长度小于16时,StringBuilder不会重新分配内存; 当StringBuilder的长度大于16且小于32时,StringBuilder会重新分配内存,使其成为16的倍数。在上面的代码中,如果预先判断字符串的长度将大于16,则可以设置一个更合适的长度(比如32)。 StringBuilder重新分配内存时,会按照上次容量加倍的情况来分配。 当然,我们需要注意的是,StringBuilder指定的长度应该是多少。 如果太小,需要频繁分配内存; 如果太大,就会浪费空间。

下面两种字符串拼接方法,哪一种效率更高:

CSharp字符串使用技巧,如何减少内存分配?

答案是:两者都是低效的。 不要认为前者创建的字符串对象比后者少。 事实上,两者创建了相同的字符串对象,并且前者调用了 3 次 string.Contact 方法,比后者多了两次。

要完成这样的运行时字符串拼接(注意:是运行时),更好的做法是使用StringBuilder类型,代码如下:

CSharp字符串使用技巧,如何减少内存分配?

微软还提供了另一种方法来简化这个操作,那就是使用 string.Format 方法。 string.Format方法内部使用StringBuilder来格式化字符串,如下代码所示:

CSharp字符串使用技巧,如何减少内存分配?

上班族必备知识~! Word排版完成后我们应该做什么? 当然是印刷了。 今天我们就跟进上一篇“设置默认打印机”,分别讲一下在XP系统和Win7系统中如何设置。 打印机共享?

打印机共享的含义是局域网内的任何一台计算机都可以通过共享打印机的方式使用同一台打印机。 多人可以共享一台打印机,这样就大大降低了耗材成本,不再需要每个人都拥有一台打印机。

打印机共享设置注意事项: 设置打印机共享之前,必须确保局域网畅通,确认共享打印机所连接的打印机已开机,且打印机驱动程序已安装并可以正常打印。

由于目前Win7操作系统留存最多,但XP的经典版本仍然被大多数人使用,所以本篇设置打印机共享的教程分别讲解了XP和Win7这两个不同系统的设置方法。

XP系统如何设置打印机共享

1、将本地打印机设置为共享打印机,以便局域网内的其他用户也可以使用。

①打开“开始”菜单中的“打印机和传真”;

CSharp字符串使用技巧,如何减少内存分配?

②进入“打印机和传真”窗口后,右键单击需要共享的打印机,然后选择“共享”;

CSharp字符串使用技巧,如何减少内存分配?

③在弹出的窗口中,我们选择“共享”,然后选择“共享这台打印机”,并给出共享名称“lichaoMP140”,然后确认;

CSharp字符串使用技巧,如何减少内存分配?

④ 此时,我们的电脑就设置为共享打印机了。 打印机图标比之前多了一个“小手”,这意味着我们已经设置共享成功,这台打印机可以被局域网内的其他用户使用了。

CSharp字符串使用技巧,如何减少内存分配?

2、如何找到共享打印机并打印到局域网内的共享打印机上?

刚才讲的是在本地安装服务器。 现在我们正在安装客户端。 只要添加这台共享打印机,就可以实现网络共享打印;

① 执行第三步“添加打印机”时,选择“网络打印机”,然后单击“下一步”。 用户可以在这里设置查找打印机的方式;

CSharp字符串使用技巧,如何减少内存分配?

② 如果用户想查找工作组中的打印机,可以单击“下一步”,弹出“查找打印机”对话框。 由于它位于 LAN 内,因此您可以选择单个选项“键入打印机名称,或单击“下一步”浏览打印机”。

CSharp字符串使用技巧,如何减少内存分配?

③用户可以输入打印机名称或单击“下一步”弹出“浏览打印机”对话框。 此处,共享打印机列表框列出了域中的所有共享打印机以及连接到打印机的计算机。 如果局域网中有多台打印机,用户可以在这里找到适合自己的打印机。

CSharp字符串使用技巧,如何减少内存分配?

④单击“下一步”按钮。 在弹出的对话框中,用户可以设置是否将打印机设置为默认打印机。

CSharp字符串使用技巧,如何减少内存分配?

⑤ 单击“下一步”按钮。 弹出的对话框中显示用户设置的网络打印机设置。 单击“完成”后,您就可以像使用本地打印机一样使用网络打印机了。

CSharp字符串使用技巧,如何减少内存分配?

Win7系统如何设置打印机共享

1、将本地设置为共享打印机,让局域网内的其他用户使用!

现在很多使用Word for Office的朋友都使用Win7系统,那么这里我们就详细讲解一下Win7中如何设置打印机共享。 首先,取消禁用Guest帐户,因为当其他人想要访问安装了打印机的计算机时,他们是用Guest帐户访问的。 单击【开始】按钮,右键单击【计算机】,选择【管理】,如下图:

CSharp字符串使用技巧,如何减少内存分配?

在弹出的【计算机管理】窗口中找到【Guest】用户;

CSharp字符串使用技巧,如何减少内存分配?

CSharp字符串使用技巧,如何减少内存分配?

双击【Guest】,打开【Guest Properties】窗口,确保【帐户禁用】选项没有勾选;

CSharp字符串使用技巧,如何减少内存分配?

设置共享目标打印机:点击【开始】按钮,选择【设备和打印机】,如下图:

CSharp字符串使用技巧,如何减少内存分配?

在弹出的窗口中找到您要共享的打印机(前提是打印机连接正确且驱动安装正确),右键单击该打印机,选择【打印机属性】,如下图:

CSharp字符串使用技巧,如何减少内存分配?

切换到【共享】选项卡,勾选【共享这台打印机】,并设置共享名称(请记住共享名称,后续设置中可能会用到),如下图:

CSharp字符串使用技巧,如何减少内存分配?

高级共享设置:右键单击系统托盘中的网络连接图标,选择【打开网络和共享中心】,如下图:

CSharp字符串使用技巧,如何减少内存分配?

记住您所在的网络类型,然后在弹出的窗口中点击【选择家庭组和共享选项】;

CSharp字符串使用技巧,如何减少内存分配?

然后点击【更改高级共享设置】;

CSharp字符串使用技巧,如何减少内存分配?

如果是家庭或工作网络,【更改高级共享设置】的具体设置请参考下图。 关键选项用红色圆圈标记。 设置完成后不要忘记保存更改。

CSharp字符串使用技巧,如何减少内存分配?

注意:如果是公共网络,具体设置与上面类似,但【公共】下的选项要相应设置,而不是【家庭或工作】下的;

CSharp字符串使用技巧,如何减少内存分配?

设置工作组:添加目标打印机之前,首先要确定局域网内的所有计算机是否都在一个工作组中。 具体过程为:单击【开始】按钮,右键单击【计算机】,选择【属性】,如下图:

CSharp字符串使用技巧,如何减少内存分配?

在弹出窗口中找到工作组。 如果电脑的工作组设置不一致,请点击【更改设置】; 如果一致,可以直接退出并跳至第五步。 注意:请记住【计算机名称】,后续设置时会用到。

CSharp字符串使用技巧,如何减少内存分配?

如果您在不同的工作组中,可以在此窗口中进行设置:

CSharp字符串使用技巧,如何减少内存分配?

注意:此设置将在重新启动后生效,因此设置完成后不要忘记重新启动计算机以使设置生效。 2. 在其他计算机上添加目标打印机:

注意:此步骤是在局域网内其他需要共享打印机的计算机上执行的。 此步骤的过程在XP和Win7系统中类似。 添加方式有很多种,介绍其中两种。

首先,无论您使用哪种方法,都应该先进入【控制面板】,打开【设备和打印机】窗口,点击【添加打印机】;

CSharp字符串使用技巧,如何减少内存分配?

接下来选择【添加网络、无线或蓝牙打印机】,点击【下一步】;

CSharp字符串使用技巧,如何减少内存分配?

点击【下一步】后,系统会自动搜索可用的打印机。

CSharp字符串使用技巧,如何减少内存分配?

如果前面步骤中的设置都正确的话,那么只要耐心等待,系统一般都能找到,然后按照提示一步步操作就可以了。

如果耐心等待后系统仍然找不到您需要的打印机也没关系。 也可以点击【我需要的打印机不在列表中】,然后点击【下一步】,如下图。

CSharp字符串使用技巧,如何减少内存分配?

有多种方法可以设置后续步骤。

第一种方法:

选择【浏览打印机】,点击【下一步】;

CSharp字符串使用技巧,如何减少内存分配?

找到连接打印机的电脑,点击【选择】;

CSharp字符串使用技巧,如何减少内存分配?

选择目标打印机(打印机名称为第二步中设置的名称),点击【选择】;

CSharp字符串使用技巧,如何减少内存分配?

接下来的操作就比较简单了。 系统会自动查找打印机的驱动程序并安装。 至此,打印机已添加成功。

第二种方法:在【添加打印机】窗口中选择【按名称选择共享打印机】,输入“计算机名称和打印机名称”(上面都提到了计算机名称和打印机,不确定的朋友可以查看第二种)分别进行步骤。和步骤 4 设置)。 如果前面的设置正确,输入完成后系统会给出提示(如下图),然后点击【下一步】。

CSharp字符串使用技巧,如何减少内存分配?

注意:如果这一步系统没有自动提示,直接点击【下一步】很可能无法找到目标打印机。 这时,我们可以将“计算机名”替换为“IP”,如下:

例如,如果 IP 为 10.0.32.80,则应输入“10.0.32.80Canon”。 查看系统IP的方法如下:

点击系统托盘中的【网络】图标,选择【打开网络和共享中心】;

CSharp字符串使用技巧,如何减少内存分配?

在【网络和共享中心】中找到【本地连接】并点击;

CSharp字符串使用技巧,如何减少内存分配?

在弹出的【本地连接状态】窗口中点击【详细信息】,如下图:

CSharp字符串使用技巧,如何减少内存分配?

下图中红圈标注的【IPv4地址】就是本机的IP地址。

CSharp字符串使用技巧,如何减少内存分配?

接下来,继续前面的步骤。 和第一种方法一样,系统会找到设备并安装驱动程序。 读者只需耐心等待即可;

CSharp字符串使用技巧,如何减少内存分配?

然后系统会提示用户打印机已添加成功。 直接点击【下一步】。

CSharp字符串使用技巧,如何减少内存分配?

至此,打印机已经添加完毕。 如果需要,用户可以单击【打印测试页】来测试打印机是否可以正常工作,或者直接单击【完成】退出该窗口;

CSharp字符串使用技巧,如何减少内存分配?

添加成功后,您可以在【控制面板】的【设备和打印机】窗口中看到新添加的打印机;

CSharp字符串使用技巧,如何减少内存分配?

VPS购买请点击我

文章版权声明:除非注明,否则均为主机测评原创文章,转载或复制请以超链接形式并注明出处。

目录[+]