It’s a very rare requirement, but sometimes in .NET you have to create your own primitive and make it behave as close as possible to a native CTS (common type system) type. “That shouldn’t be hard” would be your first thought, until you start considering all the scenarios in which it could be used. Continue reading “Creating your own primitive type”
Stumbled upon this article written by no other than Eric Lippert listing the top 10 design faults of C# language. Here is the summary, the source to the full article is at the bottom.
#10: The empty statement does nothing for me
Reflects on the fact that lone “;” is a legal statement
#9: Too much equality
There are too many ways check for equality: ==, Equals, ReferenceEquals, CompareTo(…).
From personal experience double.NaN == double.NaN is false but double.NaN.Equals(double.NaN) is true
#8: That operator is shifty
Weirdness around << and >> operators
#7: I’m a proud member of lambda lambda lambda
The way C# 2.0 implements anonymous delegates
#6: Bit twiddling entails parentheses
#5: Type first, ask questions later
C# borrows the “type first” pattern from C and many of its other successor languages – something I got used to and the “correct” way now seems illogical to me
#4: Flag me down
The fact that you can create invalid enum values and have to manually check for this in the code
#3: I rate plus-plus a minus-minus
++i, i++, i +=1 etc. how much confusion and the pain it caused.
#2 I want to destruct finalizers
Agree with the author that finilisers in C# are symptoms of a bug. Seen it way too many times myself.
#1 You can’t put a tiger in the goldfish tank, but you can try
“array covariance” and how this could lead to run-time exceptions.
The purpose of the adapter pattern is actually quite simple. It converts one interface to another one, thus making it possible for classes to work together where the interfaces are different.
Real World Example
Because it’s such a common pattern I had to think for a while before coming up with an example.
Say, our application has to export some data in various formats – excel, pdf etc. It would be quite likely that third party libraries for each of the formats have different interfaces. We could of course write a switch statement, but the better solution would be to wrap each of the third party libraries into a class that implements a common interface. Then all we have to do is resolve the wrapper based on the format. Since the wrapper would implement a common interface the task of exporting data become relatively simple