Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/285.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在C#中的结构中创建固定大小的字符串?_C# - Fatal编程技术网

在C#中的结构中创建固定大小的字符串?

在C#中的结构中创建固定大小的字符串?,c#,C#,我是C#的新手。我想在C#中创建一个由固定大小的字符串变量组成的结构。大小为[20]的DistributorId示例。给字符串一个固定大小的确切方法是什么 public struct DistributorEmail { public String DistributorId; public String EmailId; } 如果您确实需要一个固定长度,您可以始终使用char[]而不是字符串。如果您还需要字符串操作,则很容易转换为/从 string s = "

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

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

}

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

string s = "Hello, world";
char[] ca = s.ToCharArray();
string s1 = new string(ca);
请注意,除了一些特殊的COM互操作场景外,您始终可以只使用字符串,让框架担心大小和存储。

如果需要,预先分配的缓冲区,
字符串
不是正确的数据类型

不过,这种用法只有在互操作上下文中才有意义,否则您应该坚持使用
String
s

您还需要使用
允许不安全代码
编译程序集

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);
        }
    }
}
如果出于某种原因需要固定大小的缓冲区,但不是在互操作上下文中,则可以使用相同的结构,但不使用
safe
fixed
。然后您需要自己分配缓冲区


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

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

string(char c, int count)
此代码将创建一个长度为40个字符的新字符串,并用空格字符填充

string newString = new string(' ', 40);

作为字符串扩展,包含比固定长度长和短的源字符串:

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}";
}

为什么需要这个?我正在创建一个返回结构的Web服务。这个web服务由一个称为Sybase unwired platform的工具使用,以创建抽象对象(称为MBO或移动业务对象)。但是,当我创建字符串类型的a变量时,在Sybase unwired platform中创建的变量会发出警告,表示变量长度未定义。为了纠正这个错误,我必须定义结构中使用的变量的长度。若我使用char数据类型,我如何给它赋值。当前我正在使用distributoremail.DistributorId=((int)r[“DistributorId”]).ToString()@user2841448我在构造函数中添加了一个用法示例。当然,在构造函数中不需要进行赋值。