Jags
Jags

Reputation: 782

Using structs instead of classes for simple types

In C# if I use a struct like shown below and do an equality comparison , values of the fields of the struct would be compared and I would get a result true if all the fields have same value.This is the default behaviour.

struct PersonStruct
{
    public PersonStruct(string n,int a)
    {
        Name = n;Age = a;
    }
    public string Name { get; set; }
    public int Age { get; set; }
}

var p1 = new PersonStruct("Jags", 1);

var p2 = new PersonStruct("Jags", 1);

Console.WriteLine(p1.Equals(p2)); //Return True

In case of class same thing would return a value false as it is a reference type.

class PersonClass
{
    public PersonClass(string n, int a)
    {
        Name = n; Age = a;
    }
    public string Name { get; set; }
    public int Age { get; set; }
}
var pc1 = new PersonClass("Jags", 1);
var pc2 = new PersonClass("Jags", 1);

Console.WriteLine(pc1.Equals(pc2));//Returns False

I understand the above concept.My question is considering the above scenario is it a good idea to use structs in such simple cases instead of a class ? I have commonly seen people implement classes in such cases(e.g. simple DTOs) and do all the extra stuff to implement equality operators (such as IEquatable and overridden equals method) .

Is my understanding correct or am I missing something here ?

Upvotes: 3

Views: 140

Answers (2)

Lee
Lee

Reputation: 144136

You should avoid the default implementation of equality for structs. If your structs contain reference type fields (as PersonStruct does) then reflection is used to compare corresponding fields for equality, which is relatively slow. You should also implement IEquatable<T> for your structs since calling the object.Equals(object) method will cause boxing for both the source and argument struct. This will be avoided if the call can be resolved to IEquatable<PersonStruct>.

Upvotes: 1

Hamid Pourjam
Hamid Pourjam

Reputation: 20754

There is a whole article about this in MSDN.

✓ CONSIDER defining a struct instead of a class if instances of the type are small and commonly short-lived or are commonly embedded in other objects.

X AVOID defining a struct unless the type has all of the following characteristics:

  • It logically represents a single value, similar to primitive types (int, double, etc.).
  • It has an instance size under 16 bytes.
  • It is immutable.
  • It will not have to be boxed frequently.

In all other cases, you should define your types as classes.

Related:

When do you use a struct instead of a class?

Upvotes: 1

Related Questions