Static typed Ids (integers) in C#
Do I need to override equals operators and hascode, or would this be enough?


Structs automatically implement Equals() and GetHashCode(), but that implementation is slow. If you're actually going to use them (even indirectly, e.g. by using some LINQ methods), and you care about performance, you should override them.


  Are there any important performance penalties (during a highload)? For i.e. garbage collection.


There shouldn't be. GC doesn't get involved (unless you're going to box the values, but that's the same for integers).

I'm not sure if the runtime can optimize code using UserId as well as it could for an integer, so for performance critical code, you should make sure it's okay by profiling.


  What could be any more negative consequences from this?


I think this is not a usual pattern in C#, so one negative consequence might be some confusion by your coworkers.