2013-10-03 24 views
1

我是C#中的新手。我想在C#中创建一个由固定大小的字符串变量组成的结构体。示例尺寸为[20]的分配器ID。赋予字符串固定大小的确切方法是什么?在C#中的结构中创建固定大小的字符串?

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

} 
+0

为什么需要这个? – SWeko

+0

我正在创建一个返回结构的web服务。这种Web服务被称为Sybase unwired platform的工具用于创建抽象对象(称为MBO或移动业务对象)。但是,当我创建一个类型字符串变量时,在Sybase unwired平台中创建的变量会给出警告,说明变量的长度未定义。为了纠正这一点,我将不得不定义我的结构中使用的变量的长度。 – user2841448

回答

2

如果您需要fixed,预先分配的缓冲区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); 
     } 
    } 
} 

如果由于某种原因,你需要固定大小的缓冲区,而不是在互操作方面,你可以使用相同的结构,但没有unsafefixed。您将需要自己分配缓冲区。

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

+0

如果我使用char数据类型,我如何给它赋值。当前我正在使用 distributoremail.DistributorId =((int)r [“DistributorId”])。ToString(); – user2841448

+0

@ user2841448我在构造函数中添加了一个用法示例。当然,在构造函数中不需要赋值。 – Rotem

3

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

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

需要注意的是,除了一些特殊的COM互操作的情况下,你总是可以只使用字符串,并让有关的大小和存储架构的担心。

0

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

string(char c, int count) 

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

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

作为字符串扩展,覆盖源字符串较长和较短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}"; 
}