c# - 内存中的string.Empty和null有什么区别
问题描述
我了解赋值与否的区别,我想了解的是如何在内存中处理赋值。
什么将存储在 HEAP 和 STACK 中?哪个效率最高?
例如,拥有像这样的方法签名会更有效
private Item GetItem(pageModel page, string clickableText = null);
或者
private Item GetItem(pageModel page, string clickableText = "");
笔记:
问题不在于使用哪一个。这是关于他们在记忆中的不同之处。建议的方法可能会被调用几百次 - 因此不同的变量分配可能/可能会产生影响?
解决方案
没有区别。编译器实习字符串文字,所以你不是用调用创建一个新的字符串,只是引用一个现有的字符串。
堆和堆栈是 C# 中的实现细节。有一些行为取决于运行时,但唯一真正的约定是运行时提供您要求的尽可能多的内存,并保证如果您将来访问它,内存仍然存在。
如果您确实关心当前桌面 .NET 运行时的实现细节,则永远不会在堆栈上传递引用类型。String 是一种引用类型,所以它总是按引用传递,而不是按值传递。然而,参数甚至不需要放在堆栈上——引用也可以在寄存器中传递。
一般来说,在像 C# 这样的托管语言中,如果你有充分的理由影响程序的特性,你应该只关心内存中究竟发生了什么。默认情况下应该始终考虑语义。空字符串应该意味着“没有价值”吗?空字符串应该意味着“没有价值”吗?这取决于程序的语义。除非您有充分的理由相信该决定对性能至关重要,否则请选择最清晰、最不容易出错、最容易阅读和修改的选项。
推荐阅读
- python - 如何通过Python中的selnium定位网页中链接的href值
- c# - 在 xamarin android 项目中找不到文件错误
- python - Python:将文本文件转换为 XLS 电子表格
- hibernate - Grails Hibernate GORM,具有一对一关系的多租户
- r - metafor 中 rma 对象的样本外预测
- sql - 未明确说明时选择不包括空值
- html - 如何将图像带入 SVG?
- java - 如何在daikon中运行程序的junit测试?
- java - 如何使用 Java 应用程序连接到 DynamoDB 表并将项目插入其中
- apache-flink - 本地模式下的 Apache Flink 任务管理器数量