Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Management of strings in structs

Tags:

string

c#

struct

I know that strings have variable length, therefore they need variable space in memory to be stored. When we define a string item in a struct, the struct's size would then be variable in length.

Older languages managed this by using fixed-length strings. However, there is no way to define fixed-length strings in C#, and C# manages normal strings in structs pretty good.

This becomes more weird when we define an array of such structs, or simply an array of strings. As result of any change (decrease/increase) in length of one string, all forward structs must be shifted.

How does C# handle variable-length strings in structs?

like image 434
h.nodehi Avatar asked Feb 17 '12 19:02

h.nodehi


3 Answers

The string itself is not stored in the struct. Instead a reference to the string is stored in the struct, so the struct size never changes.

string is not a value type; .NET strings are interned, which means that each unique string is stored in a look-up table in memory.

like image 82
jjlin Avatar answered Nov 16 '22 07:11

jjlin


My first question to you would be, do your requirements dictate that a fixed length string is needed? If so a char[] might actually be what you are intending to use.

The .NET framework does not use C-style strings (char arrays) directly, but instead represents strings by immutable references. When a string is appended to or modified, you are actually creating a new string object in memory. This is a desired feature of the platform but one that requires consideration as expecting magically resizing strings can lead to some undesired side-effects.

Back to your question. "How does C# manage strings in structs?"

One of two ways to interpret this question from what I see:

1). How can I create structs that contain strings, and how does the .NET Framework manage strings in this scenario?

Short answer: keep in mind that strings are immutable types. Create your struct normally, and realize that the struct only contains a reference to the string, not a magically resizing segment of the struct that expands to include your volatile string.

2). How can the .NET Framework resize strings if they are a value type represented by structs.

Short answer, it doesn't. This isn't how .NET works with strings, see above.

like image 14
Firoso Avatar answered Nov 16 '22 08:11

Firoso


+1 to jjlin for a concise and accurate answer to the question, but a more general answer may be useful:

A field or variable declaration of any reference type represents a storage location for the reference. This is also true for fields of a struct.

(Including reference-type fields in a struct makes that type a "managed type", which is important in unsafe code; you can't declare a pointer to a managed type.)

like image 9
phoog Avatar answered Nov 16 '22 08:11

phoog