Question: I know that struct is a value type , that means it defined on stack .

But I can do A a = new A(); (A my struct of course). and it defined on heap , and only the reference variable is on stack.

Can you explain me this one please .

Answer: 
Value types are stored on the stack *sometimes*. It's a complex topic and usually the exact storage of a variable (stack or heap) is irrelevant for programming issues. The real difference between value and reference types lies in their *behaviour* (for example, value types are always copied *by value*).

Eric Lippert covers this issue in detail:

* <http://blogs.msdn.com/b/ericlippert/archive/2009/04/27/the-stack-is-an-implementation-detail.aspx>
* <http://blogs.msdn.com/b/ericlippert/archive/2009/05/04/the-stack-is-an-implementation-detail-part-two.aspx>
* <http://blogs.msdn.com/b/ericlippert/archive/2010/09/30/the-truth-about-value-types.aspx>
Your code (A a = new A();) creates and initializes the struct. If it is a local variable, it is initialized on the stack. If it is a member variable, it is initialized on the heap as part of the object. Using "new" doesn't necessarily mean a heap allocation in C#/.NET. It depends on the context.