为了账号安全,请及时绑定邮箱和手机立即绑定

在 C# 中,调整数组大小(在本例中增加其大小)会使用默认值初始化新段 - 这可靠吗?

在 C# 中,调整数组大小(在本例中增加其大小)会使用默认值初始化新段 - 这可靠吗?

C#
慕哥6287543 2023-09-16 17:22:42
在 C# 中,调整数组大小(在本例中增加其大小)会使用默认值初始化新段 - 这可靠吗?Array.Resize(ref bytes, bytes.Length + extra);我确实看到了默认值(字节数组为 0),但是是否可以安全地将其作为所有基本类型的标准行为?在我的应用程序中,节省每一秒都是一件大事,因此我认为如果默认情况下已经可用,我可以避免不必要的循环来初始化新添加的段。
查看完整描述

2 回答

?
牧羊人nacy

TA贡献1862条经验 获得超7个赞

是的,你可以信赖这一点。从文档(强调我的):

该方法分配一个指定大小的新数组,将旧数组中的元素复制到新数组,然后用新数组替换旧数组。数组必须是一维数组。

分配一个新数组保证用默认值填充它(有效地“将所有位设置为 0”),因此如果我们相信描述,整个操作的结果确实会为所有尚未复制的元素提供默认Array.Resize值来自旧数组。


查看完整回答
反对 回复 2023-09-16
?
慕哥9229398

TA贡献1877条经验 获得超6个赞

是的,它是可靠的。一种看待它的方式 - 如果新的数组元素不包含默认值,它们会包含什么?该方法不会弥补值。


我通常不会为框架代码编写单元测试,但这是测试预期行为的简单方法,特别是在文档让我们不确定的情况下。


[TestMethod]

public void Resizing_array_appends_default_values()

{

    var dates = new DateTime[] {DateTime.Now};

    Array.Resize(ref dates, dates.Length + 1);

    Assert.AreEqual(dates.Last(), default(DateTime));


    var strings = new string[] { "x" };

    Array.Resize(ref strings, strings.Length + 1);

    Assert.IsNull(strings.Last());


    var objects = new object[] { 1, "x" };

    Array.Resize(ref objects, objects.Length + 1);

    Assert.IsNull(objects.Last());

}

不用说,在运行这个单元测试后我会放弃它。我不会这么做。


查看完整回答
反对 回复 2023-09-16
  • 2 回答
  • 0 关注
  • 67 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信