2

我是 C# 的新手。我想在 C# 中创建一个由固定大小的字符串变量组成的结构。大小为 [20] 的示例 DistributorId。给字符串一个固定大小的确切方法是什么。

public struct DistributorEmail
{
    public String DistributorId;
    public String EmailId;       

}
4

4 回答 4

5

如果您需要固定的、预分配的缓冲区,String则不是正确的数据类型。

这种类型的用法只有在互操作上下文中才有意义,否则你应该坚持使用Strings.

您还需要使用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);
        }
    }
}

如果由于某种原因您需要固定大小的缓冲区,但不是在互操作上下文中,您可以使用相同的结构但不使用unsafeand fixed。然后,您需要自己分配缓冲区。

另一个要记住的重要一点是,在 .NET 中,sizeof(char) != sizeof(byte). Achar至少是 2 个字节,即使它是用 ANSI 编码的。

于 2013-10-03T06:45:32.363 回答
3

如果您确实需要固定长度,则始终可以使用 achar[]而不是字符串。如果您还需要字符串操作,则很容易转换为/从。

string s = "Hello, world";
char[] ca = s.ToCharArray();
string s1 = new string(ca);

请注意,除了一些特殊的 COM 互操作场景之外,您始终可以只使用字符串,让框架担心大小和存储。

于 2013-10-03T06:45:19.440 回答
0

您可以通过在创建时指定长度来创建新的固定长度字符串。

string(char c, int count)

此代码将创建一个长度为 40 个字符的新字符串,并用空格字符填充。

string newString = new string(' ', 40);
于 2016-10-20T14:09:06.310 回答
-1

作为字符串扩展,覆盖源字符串更长和更短比固定:

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}";
}
于 2018-02-05T09:18:31.217 回答