2013-10-03 26 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}"; 
}