gpt4 book ai didi

c# - 固定长度的字符串作为值类型用于 MemoryMappedViewAccessor

转载 作者:行者123 更新时间:2023-11-30 18:03:11 25 4
gpt4 key购买 nike

我想将结构存储到 MemoryMappedFile 中,但此结构包含引用类型的字符串(具有我知道的最大大小),因此被 MemoryMappedViewAccessor 拒绝。

你知道一个好的定长字符串结构(值类型)实现吗?如果有必要,我可以对长度进行硬编码(因为数组是引用类型)。

例如,我可以将其实例化为:

TenCharsString myString = new TenCharsString("1234567890");

用 MarshalAs 属性装饰

<MarshalAs (UnmanagedType.ByValTStr, SizeConst:=128)> 

应该可以,但没有。

最佳答案

这是一个简单的 10 字符值类型:

struct TenChars
{
public char A;
public char B;
public char C;
public char D;
public char E;
public char F;
public char G;
public char H;
public char I;
public char J;
}

如果不安全代码是一个选项,这也适用:

unsafe struct TenChars
{
public fixed char Chars[10];
}

完整代码:

struct TenChars1
{
public const int Capacity = 10;

private char A;
private char B;
private char C;
private char D;
private char E;
private char F;
private char G;
private char H;
private char I;
private char J;

public TenChars1(string value)
{
if (value == null) throw new ArgumentNullException("value");
if (value.Length > Capacity) throw new ArgumentException();

A = (value.Length > 0) ? value[0] : '\0';
B = (value.Length > 1) ? value[1] : '\0';
C = (value.Length > 2) ? value[2] : '\0';
D = (value.Length > 3) ? value[3] : '\0';
E = (value.Length > 4) ? value[4] : '\0';
F = (value.Length > 5) ? value[5] : '\0';
G = (value.Length > 6) ? value[6] : '\0';
H = (value.Length > 7) ? value[7] : '\0';
I = (value.Length > 8) ? value[8] : '\0';
J = (value.Length > 9) ? value[9] : '\0';
}

public override string ToString()
{
return new string(new char[] { A, B, C, D, E, F, G, H, I, J });
}
}

unsafe struct TenChars2
{
public const int Capacity = 10;

private fixed char buffer[Capacity];

public TenChars2(string value)
{
if (value == null) throw new ArgumentNullException("value");
if (value.Length > Capacity) throw new ArgumentException();

fixed (char* ptr = this.buffer)
fixed (char* chars = value)
{
for (int i = 0; i < value.Length; i++)
{
*(ptr + i) = *(chars + i);
}
}
}

public override string ToString()
{
fixed (char* ptr = this.buffer)
{
return new string(ptr);
}
}
}

关于c# - 固定长度的字符串作为值类型用于 MemoryMappedViewAccessor,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7432668/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com