我是C#中的新手。我想在C#中创建一个由固定大小的字符串变量组成的结构体。示例尺寸为[20]的分配器ID。赋予字符串固定大小的确切方法是什么?在C#中的结构中创建固定大小的字符串?
public struct DistributorEmail
{
public String DistributorId;
public String EmailId;
}
我是C#中的新手。我想在C#中创建一个由固定大小的字符串变量组成的结构体。示例尺寸为[20]的分配器ID。赋予字符串固定大小的确切方法是什么?在C#中的结构中创建固定大小的字符串?
public struct DistributorEmail
{
public String DistributorId;
public String EmailId;
}
如果您需要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);
}
}
}
如果由于某种原因,你需要固定大小的缓冲区,而不是在互操作方面,你可以使用相同的结构,但没有unsafe
和fixed
。您将需要自己分配缓冲区。
要牢记的另一个重点是在.NET中,sizeof(char) != sizeof(byte)
。 A char
至少是2个字节,即使它是用ANSI编码的。
如果我使用char数据类型,我如何给它赋值。当前我正在使用 distributoremail.DistributorId =((int)r [“DistributorId”])。ToString(); – user2841448
@ user2841448我在构造函数中添加了一个用法示例。当然,在构造函数中不需要赋值。 – Rotem
如果您确实需要固定长度,则可以始终使用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}";
}
为什么需要这个? – SWeko
我正在创建一个返回结构的web服务。这种Web服务被称为Sybase unwired platform的工具用于创建抽象对象(称为MBO或移动业务对象)。但是,当我创建一个类型字符串变量时,在Sybase unwired平台中创建的变量会给出警告,说明变量的长度未定义。为了纠正这一点,我将不得不定义我的结构中使用的变量的长度。 – user2841448