To expand the pid answer:
test = new Testing { s = hello }
listed as having semantics:
Testing temp = new Testing(); temp.s = "hello"; test = temp;
The default constructor of a value type is documented as a constructor that sets all instance fields to default values.
In a more general sense, C # requires that any value type constructor have a property, so that all fields are necessarily assigned before the constructor completes normally.
Now, if the constructor is not called, then there are two cases. If the variable was originally assigned, the variable acts as if the default constructor were called. For example, if you say
Testing[] test = new Testing[1];
Then test[0] initialized to the default value just as if you said
Testing[] test = new Testing[1] { new Testing() };
If a variable is not initially assigned, for example, a local variable, you must necessarily assign all the fields before reading them. That is, if we have local:
Testing test; test.s = "hello"; Console.WriteLine(test.d); // ERROR, test.d has not been written yet.
Note also that volatile structures are the worst practice in C #. Instead, create a public constructor that defines all the fields, make the fields private, and put getters properties in them.