object
is valid for all .NET versions.
It is the base type that all other types inherit from, so any type can be cast to object
.
You can't dynamically add and change anything on a variable declared as object
.
The declaration is a statically typed and checked by the compiler.
dynamic
is new for .NET 4.0.
It allows you do dynamically add and change properties and methods without the compiler checking them (so if what you wrote is wrong you will only find out at runtime).
In terms of memory allocation - not much of a difference. Both are reference types and whatever object assigned to either will already have memory allocated to storing it.
In regards to performance, since the DLR gets involved with dynamic
, there will be some overhead. You will need to test and see.
As for other benefits - dynamic
really helps with readability when dealing with dynamic objects/data, for example XML files. It also helps with reflection in a similar way.
Of course, if you want to have dynamic objects, you can't use object
and have to use dynamic
.