Pride
Pride

Reputation: 43

create fixed size string in a struct in C#?

I m a newbie in C#.I want to create a struct in C# which consist of string variable of fixed size. example DistributorId of size [20]. What is the exact way of giving the string a fixed size.

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

}

Upvotes: 2

Views: 20728

Answers (4)

Harps
Harps

Reputation: 672

As string extension, covers source string longer and shorter thand fixed:

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

Upvotes: -1

user4618993
user4618993

Reputation:

You can create a new fixed length string by specifying the length when you create it.

string(char c, int count)

This code will create a new string of 40 characters in length, filled with the space character.

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

Upvotes: 0

Rotem
Rotem

Reputation: 21917

If you need fixed, preallocated buffers, String is not the correct datatype.

This type of usage would only make sense in an interop context though, otherwise you should stick to Strings.

You will also need to compile your assembly with 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);
        }
    }
}

If for some reason you are in need of fixed size buffers, but not in an interop context, you can use the same struct but without unsafe and fixed. You will then need to allocate the buffers yourself.

Another important point to keep in mind, is that in .NET, sizeof(char) != sizeof(byte). A char is at the very least 2 bytes, even if it is encoded in ANSI.

Upvotes: 5

SWeko
SWeko

Reputation: 30882

If you really need a fixed length, you can always use a char[] instead of a string. It's easy to convert to/from, if you also need string manipulation.

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

Note that, aside from some special COM interop scenarios, you can always just use strings, and let the framework worry about sizes and storage.

Upvotes: 3

Related Questions