user1968030
user1968030

Reputation:

Why should we initialize a struct before passing it to a function?

Consider this code:

 MyStruct j;
 j.I = 3;
 Console.WriteLine(j.I);

Now see this method:

  public static void StructMod(MyStruct ms)
  {
      ms.I += 100;
      Console.WriteLine(ms.I);
  }

When we pass MyStruct to the method, should we initialize it before passing it? I.e.:

MyStruct j = new MyStruct()

Upvotes: 1

Views: 75

Answers (3)

Sean U
Sean U

Reputation: 6850

If you want the struct to have a particular value, then initialize it to that value.

If you want the struct to be initialized to its default value, then you don't need to explicitly initialize it. However, it might still be best to do so for the sake of readability if the struct's default value is non-obvious.

As a side note: Mutable structs are really bad; the entire scenario you propose in your example is a code smell. See Why are mutable structs “evil”?

The same behavior could be achieved more safely with an immutable struct like so

struct MyStruct 
{
  public readonly int I;

  public MyStruct(int i_initial)
  {
    I = i_initial;
  }
}

MyStruct j = new MyStruct(3);

public static void StructMod(MyStruct ms)
{
  Console.WriteLine(ms.I + 100);
}

In particular, note that from the caller's point of view this function's behavior will be exactly the same as the one in the question, because structs are passed by value the same way that primitives like int are. If the "Mod" in StructMod is there because you expect this function to modify the value, then that's a good concrete example of why it's generally better for mutable types to be objects and not structs.

Upvotes: 0

Grant Winney
Grant Winney

Reputation: 66449

After a little testing, it seems that either way you declare it, it's being initialized.

One reason to call new ... would be to execute code in the constructor, if any.

Take this sample from MSDN, for example:

public struct CoOrds
{
    public int x, y;

    public CoOrds(int p1, int p2)
    {
        x = p1;
        y = p2;
    }
}

You could just do this, and use c, but then x and y will be 0.

CoOrds c;

Alternatively, you could do this, and then x and y start off with values.

CoOrds c = new CoOrds(5,3);

(This would be more useful if the ctor did something more interesting.)

Upvotes: 0

Jonathon Reinhart
Jonathon Reinhart

Reputation: 137398

Unless struct is value type?

Yes, it is.

First line from MSDN:

A struct type is a value type...

As with individual variables, a struct must be fully initialized before it can be used. Consider:

struct Foo
{
    public int Bar;
    public int Pop;
}

class Program
{
    static void Main(string[] args) {
        Foo f;
        f.Bar = 3;

        test(f);        // ERROR: Use of unassigned local variable 'f'
    }

    static void test(Foo f) {
        Console.WriteLine("{0}", f.Bar);
    }
}

The solution here is to either initialize .Bar, or simply call the Foo constructor f = new Foo() which initializes all members to their default values.

This is the same logic behind the "Field ... must be fully assigned before control is returned to the caller" error that you get when adding parameterized constructors to structs.

Upvotes: 1

Related Questions