在 C# 中的结构中创建固定大小的字符串
本文关键字:字符串 创建 结构 | 更新日期: 2023-09-27 18:33:37
我是C#的新手。我想在 C# 中创建一个由固定大小的字符串变量组成的结构。大小为 [20] 的分发服务器 ID 示例。给字符串一个固定大小的确切方法是什么。
public struct DistributorEmail
{
public String DistributorId;
public String EmailId;
}
如果需要固定的预分配缓冲区,则String
不是正确的数据类型。
不过,这种类型的用法只有在互操作上下文中才有意义,否则您应该坚持使用 String
s。
您还需要使用 allow unsafe code
编译程序集。
unsafe public struct DistributorEmail
{
public fixed char DistributorId[20];
public fixed char EmailID[20];
public DistributorEmail(string dId)
{
fixed (char* distId = DistributorId)
{
char[] chars = dId.ToCharArray();
Marshal.Copy(chars, 0, new IntPtr(distId), chars.Length);
}
}
}
如果由于某种原因您需要固定大小的缓冲区,但不是在互操作上下文中,则可以使用相同的结构,但不使用 unsafe
和 fixed
。然后,您需要自己分配缓冲区。
要记住的另一个重要点是,在 .NET 中,sizeof(char) != sizeof(byte)
.char
至少为 2 个字节,即使它是用 ANSI 编码的。
如果你真的需要固定的长度,你总是可以使用char[]
而不是字符串。如果您还需要字符串操作,则很容易转换为/转换。
string s = "Hello, world";
char[] ca = s.ToCharArray();
string s1 = new string(ca);
请注意,除了一些特殊的 COM 互操作方案外,您始终可以只使用字符串,让框架担心大小和存储。
您可以通过在创建时指定长度来创建新的固定长度字符串。
string(char c, int count)
此代码将创建一个长度为 40 个字符的新字符串,并用空格字符填充。
string newString = new string(' ', 40);
作为字符串扩展,覆盖源字符串越来越长和更短 thand 固定:
public static string ToFixedLength(this string inStr, int length)
{
if (inStr.Length == length)
return inStr;
if(inStr.Length > length)
return inStr.Substring(0, length);
var blanks = Enumerable.Range(1, length - inStr.Length).Select(v => " ").Aggregate((a, b) => $"{a}{b}");
return $"{inStr}{blanks}";
}