我正忙于将一个用C++完成的旧项目重写成C#.

我的任务是重写程序,使其功能尽可能接近原始程序.

在一系列文件处理过程中,编写此程序的前开发人员创建了一个包含大量字段的 struct ,这些字段与文件必须写入的设置格式相对应,所以所有这些工作都已经为我完成了.

这些字段都是字节array.然后,C++代码使用memset将整个 struct 设置为所有空格字符(0x20).一行代码.轻松点.

这一点非常重要,因为该文件最终指向的实用程序希望该文件采用这种格式.我要做的是将这个 struct 更改为C#中的一个类,但我找不到一种方法来轻松地将这些字节数组初始化为所有空格字符.

我最终不得不在类构造函数中执行以下操作:

//Initialize all of the variables to spaces.
int index = 0;
foreach (byte b in UserCode)
{
    UserCode[index] = 0x20;
    index++;
}

这很好用,但我相信一定有更简单的方法来做这件事.当在构造函数中将数组设置为UserCode = new byte[6]时,字节数组会自动初始化为默认的空值.有没有办法让它在声明时变成全空格,这样当我调用我的类的构造函数时,它就像这样被直接初始化了呢?或者是一些类似memset的函数?

推荐答案

对于小数组,请使用数组初始化语法:

var sevenItems = new byte[] { 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20 };

对于较大的数组,使用标准的for环路.这是最具可读性和效率的方法:

var sevenThousandItems = new byte[7000];
for (int i = 0; i < sevenThousandItems.Length; i++)
{
    sevenThousandItems[i] = 0x20;
}

当然,如果您经常需要这样做,那么您可以创建一个helper方法来帮助保持代码的简洁性:

byte[] sevenItems = CreateSpecialByteArray(7);
byte[] sevenThousandItems = CreateSpecialByteArray(7000);

// ...

public static byte[] CreateSpecialByteArray(int length)
{
    var arr = new byte[length];
    for (int i = 0; i < arr.Length; i++)
    {
        arr[i] = 0x20;
    }
    return arr;
}

.net相关问答推荐

.NET发布的应用程序运行与开发不同的端口

如何在dotnet中使用OpenTelemetry Prometheus导出器导出多个版本的度量?

在`MAUI`应用中使用Android`MediaPlayer`的`prepare`方法只在发布模式下和在物理设备上崩溃

是否必须使用 Visual Studio 预览才能使用 MAUI?

EGC / 文本元素上的 .NET String.Split

在 Git for Visual Studio 2012 中恢复到以前的提交

Owin Twitter登录-根据验证程序远程证书无效

设置日志(log)文件名以在 Log4j 中包含当前日期

为什么 .Contains 慢?通过主键获取多个实体的最有效方法?

我可以使用 UriTemplate 将非字符串传递给 WCF RESTful 服务吗?

Winforms:Application.Exit vs Environment.Exit vs Form.Close

图像与位图类

基于多个字符分隔符拆分字符串

.NET 事件 - 什么是对象发送者和 EventArgs e?

风格上的差异:IDictionary vs Dictionary

mscorlib 代表什么?

设置 System.Drawing.Color 值

单元测试 C# 保护方法

我应该如何删除 DbSet 中的所有元素?

.NET 的 XPath 和 XSLT 2.0?