首页 > 解决方案 > 内存中的string.Empty和null有什么区别

问题描述

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

什么将存储在 HEAP 和 STACK 中?哪个效率最高?

例如,拥有像这样的方法签名会更有效

private Item GetItem(pageModel page, string clickableText = null);

或者

private Item GetItem(pageModel page, string clickableText = "");

笔记:

问题不在于使用哪一个。这是关于他们在记忆中的不同之处。建议的方法可能会被调用几百次 - 因此不同的变量分配可能/可能会产生影响?

标签: c#

解决方案


没有区别。编译器实习字符串文字,所以你不是用调用创建一个新的字符串,只是引用一个现有的字符串。

堆和堆栈是 C# 中的实现细节。有一些行为取决于运行时,但唯一真正的约定是运行时提供您要求的尽可能多的内存,并保证如果您将来访问它,内存仍然存在。

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

一般来说,在像 C# 这样的托管语言中,如果你有充分的理由影响程序的特性,你应该只关心内存中究竟发生了什么。默认情况下应该始终考虑语义。空字符串应该意味着“没有价值”吗?空字符串应该意味着“没有价值”吗?这取决于程序的语义。除非您有充分的理由相信该决定对性能至关重要,否则请选择最清晰、最不容易出错、最容易阅读和修改的选项。


推荐阅读