1

I'm in a discussion with a co-worker concerning the use of structs. I have a couple of structs that contain several static properties that are used throughout our website. The value of those properties are all strings. They're not very long, the longest value has 29 characters.

His argument: "I am saying there is no performance gain because there are strings inside of them. For value types yes you gain memory/gc benefits. With strings they are ref types so allocate to the heap and won't give any benefit."

My argument: "...I'm simply treating the string values as value types by using the struct, therefore saving time and gaining performance by not having to instantiate it every time."

Here is an example of one of the structs so that you can see how I'm using them:

public struct Hero
    {
        public static string Image          = "Hero Image";
        public static string Eyebrow        = "Hero Eyebrow";
        public static string Heading        = "Hero Heading";
        public static string Subheading     = "Hero Subheading";
        public static string YoutubeLink    = "Youtube Hero Link";
        public static string PardotForm     = "Pardot Form Hero Link";
        public static string PardotDirect   = "Pardot Direct Hero Link";
        public static string DirectLink     = "Direct Hero Link";
        public static string FacebookLink   = "Hero Facebook Link";
        public static string TwitterLink    = "Hero Twitter Link";
        public static string LinkedInLink   = "Hero LinkedIn Link";
        public static string LinkClassNames = "Class Names";
    }

Let me know if I'm completely wrong and should just use classes or if there is a better way of using the structs for my values (i.e: readonly instead of static, etc...).

  • 4
    What does a struct have to do with this? Statics don't much care if they're in a struct or not. Though... you probably want to make these const or at least readonly to prevent someone rewriting your globals :P – Telastyn Jan 22 at 21:27
  • 1
    What language is this? Best to make it explicit. – Alexander Jan 22 at 21:36
  • This is c#, although the concepts are universal in OOP. – Necromancer Jan 22 at 21:37
  • ....and of course I immediately think "But shouldn't some of those be runtime properties, not compile-time properties?". Once you start including things like "Facebook", "Twitter", and "LinkedIn", I get suspicious that there might be a more maintainable way of doing things.... – Clockwork-Muse Jan 22 at 21:51
  • I think there is a good argument for strings shouldn't be in the code at all but in some resource file, for C# i tend to use the standard settings file – jk. Jan 23 at 13:02
2

I'll assess what you both said:

  • "For value types yes you gain memory/gc benefits." -> True.
  • "With strings they are ref types so allocate to the heap and won't give any benefit." -> True.
  • "..I'm simply treating the string values as value types by using the struct" -> This doesn't make sense. You can't "treat" as value types or reference types. That's determined by how String is implemented. Given that String is read-only and un-subclassible in most programming languages, it usually has value semantics (even if it is really implemented as a reference to a heap object"
  • "therefore saving time and gaining performance by not having to instantiate it every time." -> The struct doesn't matter here. String constants are in a static portion of the program, they're not subject to garbage collection, and they're not on the heap.

Putting these strings in struct vs. a class doesn't matter. As long as they're string constants, they're lazily initialized the first time the struct/class is references.

  • Don't know about C# but in Java constant strings (Java final) are actually inlined so often the class containing them isn't even loaded. (Also makes for some extra funky things that can happen with reflection if you are not careful) – Hangman4358 Jan 22 at 22:48
  • @Hangman4358 Thats correct in C# aswell, but these arent declared as const, the values are all calculated at runtime – richzilla Jan 23 at 8:50
0

stings in a struct as values to static properties

This is a head splitting description. First, strings are always reference types, no matter how or where you declare them. Your struct will be empty because you have no non-static members. The references will take up 4 * 12 bytes in size. Where the characters are will no longer matter, they will remain in the same place for the lifetime of your process. If you want the text to be laid out in a struct you must use character arrays instead and declared them non-static.

Second, there are no properties in your example. You only have data members.

Performance-wise you gain nothing by having strings contained in a struct. You may even lose performance if you are not careful by cause boxing and unboxing.

Either way, for accessing the strings it would not bear significance. Reading a string of only a couple of characters will already take longer than finding the first character, which is really what this is about. And this ratio will quickly increase as the string gets longer.

  • "Your struct will be 4 * 12 bytes in size" -> No it won't, because these are static fields. – Alexander Jan 22 at 22:23
  • "You may even lose performance if you are not careful by cause boxing and unboxing." There's no boxing/unboxing going on, because there are no struct instances – Alexander Jan 22 at 22:24
  • @Alexander We do not know if he has struct instances or not, for all we know he may create an instance and pass that Hero around as an argument to a method as a ref parameter. The struct itself is not declared static. I realize you are right with your first comment, I will edit. – Martin Maat Jan 22 at 22:35
  • I don't create instances of my structs I access them directly wherever needed and I never see the need to use them as ref parameters. – Necromancer Jan 23 at 14:12

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.