内存中的string.Empty和null有什么区别

Ale*_*Leo 1 c#

我了解分配值与不分配值的区别,我想了解的是分配如何在内存中处理。

什么将存储在HEAP和堆栈中?哪一个是最有效的?

例如,使方法签名更有效

private Item GetItem(pageModel page, string clickableText = null);
Run Code Online (Sandbox Code Playgroud)

要么

private Item GetItem(pageModel page, string clickableText = "");
Run Code Online (Sandbox Code Playgroud)

注意:

问题不在于使用哪个。这是关于它们在内存上的差异。提议的方法可能被调用数百次-因此,不同的变量分配可能/会产生影响吗?

Lua*_*aan 7

没有区别 编译器会保留字符串文字,因此您不必通过调用来创建新字符串,而仅引用现有字符串。

堆和栈是C#中的实现细节。有一些行为取决于运行时,但是唯一的实际约定是运行时提供所需的内存,并保证将来访问时该内存仍然存在。

如果您确实关心当前桌面.NET运行时的实现细节,则引用类型永远不会在堆栈上传递。字符串是一种引用类型,因此它总是按引用传递,而不是按值传递。但是,甚至不需要首先将参数放在堆栈上-引用也可以在寄存器中传递。

通常,在像C#这样的托管语言中,只有在有充分的理由影响内存的程序特性时,才应考虑内存中到底发生了什么。默认情况下应该始终在考虑语义。空字符串应该表示“无值”吗?空字符串应该表示“无值”吗?那取决于程序的语义。除非您有充分的理由相信该决定对性能至关重要,否则请选择最明确的选择,最不容易出错,并且最容易阅读和修改。