My Leading Candidate for Worst C# Feature – Method Hiding

I love C#, I really do. Of course is has its little annoying quirks here and there, but in general it is, IMHO, one of the best static programming languages out there. Having said that, one thing that makes me wonder “WHAT THE HELL WERE THEY THINKNING?!?$?!?” every single time is the feature known as “Method Hiding”.

What is Method Hiding?

Method hiding, in short, is the crippled, mentally-ill brother of method overriding. For example, look at the next code:

class A
{
  public string GetName()
  {
    return "A"; 
  }
}

class B : A
{
  public new string GetName()
  {
    return "B";
  }
}

Class A has a GetName method; class B inherits from class A and implements the GetName method as well. 
Look carefully at the GetName method signature in class B – do you see the new keyword there? this means that the method doesn’t override the implementation in class A, it just hides it. What does that mean? read on.

So What’s the Big Deal? Hide, Override… Who Cares?

There is a huge difference in the behavior of method hiding and overriding. Look at the next two samples:

Method hiding vs. Method overriding

The left part is a method hiding example, and the right part is a method overriding example. Now let’s go through the use cases.

First – using the father classes:

FatherHidden fh = new FatherHidden();
fh.GetName(); // = "A"

FatherVirtual fv = new FatherVirtual();
fv.GetName(); // = "A"

Both are available and return the same result. Good.

Second – using the son classes:

SonHiding sh = new SonHiding();
sh.GetName(); // = "B"

SonOverriding so = new SonOverriding();
so.GetName(); // = "B"

Again, both methods return the expected result. Swell!

Third – using polymorphism – storing an instance of the son classes in a father class variable and calling the GetName method:

FatherHidden fh = new SonHiding();
fh.GetName(); // = "A"

FatherVirtual fv = new SonOverriding();
fv.GetName(); // = "B"

See that? the hidden method (FatherHidden.GetName) had suddenly woken up, took over and returned “A” instead of the expected “B”! kicking polymorphism out the door while doing it!

Is It a Problem?

Yes, it is. I’ve never found any reason to use method hiding and I can’t think of a good reason start using it in the future. OOP is great and I can’t understand why we need ways to screw it up. In my opinion, if you get to a situation where you need to use method hiding, re-think your design and start over.

This is not just a cute code smell. It can lead to nasty bugs along the way. For instance, I came across something like the next piece of code when doing a code-review lately:

class Base
{
  public bool IsAuthenticated { get { return false; } }
}
class SomeAuthClass : Base
{
  public new bool IsAuthenticated { get { return CheckAuthentication(); } }
}

Now, as long as they use SomeAuthClass variable types on their system, everything will work fine. But once a developer comes and wants to use some OOP magic, all users will immediately become unauthenticated. And this is no fun. No fun at all.

One of my major problems with method hiding is that it is C#’s default behavior – you don’t even need to write the new keyword. And even if the method on the base class is marked as virtual, and you forget to mark the method on the inheriting class with override – you fall back to method hiding…

#sadpanda

What I Am Suggesting

I know this feature isn’t going to disappear. Ever. I’m sure some people have found a reason to use it like there’s no tomorrow and Microsoft is one of the best in keeping their products backwards-compatible.

However, I would like:

  • To get a compilation error if a method is going to hide another method and is not marked with the new keyword.
  • To make the method hiding feature obsolete (yes, obsolete!) and get a compilation warning when using this feature in future versions of the framework.
  • You to stop using method hiding.
  • Everyone to recycle more and save the planet!

All the best,
Shay.

kick it on DotNetKicks.com Shout it




Comments

July 25. 2011 10:20 PM

pingback

Pingback from techblog.ginktage.com

Interesting .NET Links - July 25 , 2011 | Tech Blog

techblog.ginktage.com

July 26. 2011 09:42 AM

pingback

Pingback from syngu.com

My Leading Candidate for Worst C# Feature –... | C# and .NET | Syngu

syngu.com

July 26. 2011 11:49 AM

pingback

Pingback from blog.cwa.me.uk

The Morning Brew - Chris Alcock  » The Morning Brew #902

blog.cwa.me.uk

July 26. 2011 12:37 PM

Damien

1. It already raises a *warning* (CS0108). If you want an error, turn on warnings as errors.
2. You can't remove it. You shouldn't *set out* to write such code, but it addresses specific scenarios where *you're not the author of all the code*.

Taking your first example, imagine A and B are in different assemblies, A provided by a third party, A does not currently have a GetName method, and B GetName is not marked "new".

You (and others) write code using your B implementation. If they want to invoke GetName, they obviously use a variable of type B, or further derived, since A doesn't have that method.

Now, the author of A comes along and adds a new method called GetName. Without method hiding existing, and being the default, now all of the derived code (B, etc) breaks, until such time as it's all recompiled. That's not good.

Of course, at the time you *do* recompile your B code, you now get a warning, which prompts you to investigate the new GetName function in your base class.

Damien

July 26. 2011 01:33 PM

Mike

The authentication example should be rewritten to either:

- throw not implemented in the base class
- use an interface instead of a base class

Mike

July 26. 2011 07:52 PM

Ron Warholic

Eric Lippert from the C# compiler team has addressed this before on his blog: blogs.msdn.com/.../method-hiding-apologia.aspx

In short--the purpose of method hiding is to make up for the lack of return type covariance on methods and give reasonable ways to implement patterns that don't use inheritance.

Ron Warholic

July 26. 2011 08:29 PM

Philip

Yes, using method hiding where you have complete control over across the hierarchy, and you do not need to worry about breaking contracts is pointless - you shouldn't ever need it.

But that isn't the scenario it exists for.  c# is an OOP language, so it is valid to assume that some libraries will allow or require the library user to use inheritance, and method hiding helps overcome some of the brittle base class issues.  

Before you ask "what were they thinking", think through those other scenarios and figure out how you would solve them.  There are other ways, to be sure, but those ways create issues as well.  It's not nearly as clear cut as your simple single-case example seems to show.

Philip

July 26. 2011 08:56 PM

Scott S

I once wondered what method hiding was good for, so I asked stackoverflow.  As usual it was educational.

stackoverflow.com/.../is-method-hiding-ever-a-good-idea

Scott S

July 26. 2011 09:35 PM

Brennan Fee

This is a common misconception from younger developers who came in after OO became prevalent.  Generally there area always historic reasons for these "inventions".

The "primary" purpose for this is not simply to get around lack of covariance for return types (with all due respect to the brilliant Mr. Lippert).  Instead, it is to deal with a specific yet esoteric edge case that can occur in real world situations.

The primary purpose comes when you need a different method signature and don't want an overload.  Using your examples, perhaps you need a child class with a GetName method that receives a DateTime as input.  In this situation your only options are an overload - for languages that support them - or hiding the underlying method due to the method signature change (overriding would be an error and wouldn't compile).

While avoiding a divergence from the original contract should always be the goal, at times it does come up in real world situations (particularly when you don't own the base class as previously mentioned).  Whether you go with an overload or hiding the base method, you are presented with the same problem... polymorphism will "break".  Which is to say that casting the child class to its base will mean that the cast reference will have no knowledge of the new method.  (As your third example demonstrated.)

This is actually not a C# idiosyncrasy at all as many (if not most) OO languages support this sort of construct.  It stems from the nature of the way VMT's (Virtual Method Tables) are used to resolve a method.  By nature this constuct inverts the order of the method hierarchy and presents an alternate form of method resolution (bottom-up instead of top-down if you will).

Regardless, this technique should always be seen as suspect and scrutinized for other ways of solving the same problem.  In most situations a different design could be used to generate the same end result without the potential for "surprises".

That being said following a different design may be inordinately painful or impossible and so this technique presents the shortest best path to resolution.  Properly documented and moving forward with this option can get you past some genuinely sticky situations.

Brennan Fee

July 26. 2011 10:07 PM

Arik Poznanski

+1 for Damien.

This is a must feature to prevent future breaking of code when the base class changes.
The example is better understood when the method name is Init (who doesn't have an Init method..)

Arik Poznanski

July 27. 2011 09:14 PM

Nicholas Carey

While I agree with the auther that method hiding is (in general) a Bad Idea, the real problem lies in the implementation.

The problem is that method hiding is that, even though it comes with a warning, the default behaviour is to hide, rather than override. The default behaviour results in class hierarchies that violate Liskov's Substution Principal, that an instance of a subtype when upcast to its supertype should be completely substitutable for the supertype: the method using the supertype instance reference should not need to know the actual type of the instance. The default behaviour of method hiding result in the behaviour of the subclass changing when upcast and the user of the object needs to know what the exact type in order to know what to expect. If I invoke a method of an object instance, I should alway get exactly the same behaviour regardless of whether its been upcast or not.

The default behavour should be to do the expected — override — without having to specify the supertype's member as 'virtual' or the  or the subtype's member as 'override'. One should need to work to get to the oddball behaviour; one should not need to work to get the usual and expected behaviour.

Nicholas Carey

July 29. 2011 09:33 PM

pingback

Pingback from kerrubin.wordpress.com

Feeds Of The Week #6 « kerrubin's blog

kerrubin.wordpress.com

August 1. 2011 07:46 PM

Itzhak Kasovitch

Aren't static analysis tools like FxCop and StyleCop provide rules for this situations. In not you can define a custom rule that produces a warning and then turn on TreatWarningsAsError so that the compiler will alert you when this happen.

regards,
Itzik

Itzhak Kasovitch

October 18. 2011 07:45 AM

pingback

Pingback from technologyreview.radioonthenet.mobi

Rick Ross Suffers 2nd Seizure On Way To Memphis (Update!) | Technology Review

technologyreview.radioonthenet.mobi

November 18. 2011 05:54 PM

pingback

Pingback from channel11news.nambii.com

European Central Bank steps in to counter bond rout
    (Reuters) | Channel 11 News

channel11news.nambii.com

December 3. 2011 03:59 PM

no credit check cash advance


I agree with your Blog and I will be back to check it more in the future so please keep up your work. I love your content & the way that you write. It looks like you’ve been doing this for a while now, how long have you been blogging for?
<a rel="dofollow"href="http://www.paydayloanbuff.com">no credit check cash advance</a>

no credit check cash advance

December 3. 2011 03:59 PM

no credit check cash advance

you probably have invested a lot of time in the procedure and the downtime is really impressive. What interests me is one thing further - how did you make those nice picturefor the tutorial. It's really impressive

no credit check cash advance

December 4. 2011 01:52 AM

Dark Star Clothing

Your site is good Actually, i have seen your post and That was very informative and very entertaining for me. Thanks for posting Really Such Things. I should recommend your site to my friends. Cheers.

Dark Star Clothing

December 4. 2011 06:00 AM

Lindy B

Hi  This is a very interesting blog, I think the information that you are giving is helpful. Thank you for sharing it Lindy

Lindy B

December 4. 2011 09:45 AM

jinkaz

This is what I have been searching in many websites and I finally found it here. Amazing article. I am so impressed. Could never think of such a thing is possible with it…I think you have a great knowledge especially while dealings with such subjects. <a href="www.graduateschoolpersonalstatement.net/">grad school personal statement</a>

jinkaz

December 4. 2011 09:48 AM

jinkaz

very good..... [url=http://www.graduateschoolpersonalstatement.net/]grad school personal statement[/url]

jinkaz

December 4. 2011 11:19 AM

recruiters

I thank you for the information you provided in your blog, you have very interesting topics.

recruiters

December 4. 2011 04:24 PM

claims solicitor

This is a very interesting blog, I think the information that you are giving is helpful.I am so impressed. Could never think of such a thing is possible with it…

claims solicitor

January 11. 2012 09:41 AM

tank fittings

I wanted to thank you for this great read!! I definitely enjoying every little bit of it I have you bookmarked to check out new stuff you post.

tank fittings

January 11. 2012 04:06 PM

hty gold

Thank you for constantly posting of so many useful tips.They are such a great help to me.Thank you very much!.

hty gold

January 12. 2012 10:06 AM

Online Pharmacy

Well i was more interested to learn coding, C#, but when i started it blown my head, i cant find out the logic but slowly it was interesting and thanks for sharing the info about the Method hiding.

Online Pharmacy

January 12. 2012 12:05 PM

Brain Dumps

I just saw your Method Hiding? Just great.

Brain Dumps

January 13. 2012 11:35 AM

gamefly free trial

Great post.It was very interesting. The article was very helpful. Keep up the good work.

gamefly free trial

January 14. 2012 08:11 AM

Directory Submission

I would sure like to know where you got all this great information at. I have been researching this for some time now and you have the best content.

Directory Submission

January 16. 2012 03:33 AM

cleaning services st skilda

Keep up the great work!! and also, Thanks on your interesting content material this specific information really useful.. and, Everyone should take the time to put up web content as good as this one and never saturate the internet with nothing…! also, I will share this with all of my friends..

cleaning services st skilda

January 18. 2012 03:50 PM

arabic letter

This is a wonderful content. I will bookmark this site and visit again. It is very informative. Thanks for sharing.

arabic letter

January 31. 2012 10:23 PM

pingback

Pingback from amazinlyricsyoungjeezy.juliodelvalle.com

Flat Panel Anglepoise Lamps Are the Future [Desired] | Amazin Lyrics Young Jeezy

amazinlyricsyoungjeezy.juliodelvalle.com

February 8. 2012 05:11 AM

Dreamweaver CS4 tutorial

C# really bring possibilities that most of us don't even imagine it can be done with C#.

Dreamweaver CS4 tutorial

February 8. 2012 09:49 AM

shorthairstylz

One of the best ways to disguise a bad hair day, and you will have many when you are growing out your hair is to accessorize.

shorthairstylz

February 8. 2012 09:51 AM

Screen Printing Machine

When turning screen printing from a hobby into a business it will make life a lot easier to invest in a machine

Screen Printing Machine

February 8. 2012 02:27 PM

NJ Moving

Wish I could find such informative sites more often. I regularly spend much time
on just looking for some worthy sites when I can find something to think about.

NJ Moving

February 8. 2012 02:53 PM

Brisbane Pools

I remember myself back when I was starting to learn the C#, it requires me a lot of note to always remind myself the function of each code and command

Brisbane Pools

February 8. 2012 09:22 PM

Good Dreakdancing Songs – Free Downloads

This point of view has really encouraged. I was arguing about it with my friends, but now I'm definitely sure, I was right. Thanks a lot. You've helped me a lot!
I’ll be implementing all you said, thank you so much for the information.

Good Dreakdancing Songs – Free Downloads

February 9. 2012 12:34 PM

Accommodation Croatia

I don’t know what to say except that I have enjoyed reading. Nice blog, I will keep visiting this blog very often.

Accommodation Croatia

February 10. 2012 06:40 AM

Monster Beats Studio

I don’t know what to say except that I have enjoyed reading. Nice blog, I will keep visiting this blog very often.

Monster Beats Studio

February 10. 2012 06:48 AM

Red Sox

I don’t know what to say except that I have enjoyed reading. Nice blog, I will keep visiting this blog v

Red Sox

February 13. 2012 04:02 AM

Ralph Lauren outlet

should take the time to put up web content as good as this one and never saturate the internet with nothing…! also, I will share this with all of my friends..

Ralph Lauren outlet

February 13. 2012 05:17 AM

ghd hair straighteners

I'm definitely sure, I was right. Thanks a lot. You've helped me a lot!
I’ll be implementing all you said, thank you so much for the information.

ghd hair straighteners

February 13. 2012 06:51 AM

ralph lauren kids outlet

<a href="http://www.ukpolosralphlaurensale.com/" rel="dofollow">ralph lauren kids uk</a>
<a href="http://www.ukpolosralphlaurensale.com/" rel="dofollow">ralph lauren polo uk</a>

ralph lauren kids outlet

February 13. 2012 08:54 AM

fendi purses sale

<a href="http://www.fendihandbagsoutlets.com/" rel="dofollow">fendi purses outlet</a>
<a href="http://www.fendihandbagsoutlets.com/" rel="dofollow">fendi spy bag</a>
<a href="http://www.fendihandbagsoutlets.com/" rel="dofollow">fendi purse</a>
<a href="http://www.fendihandbagsoutlets.com/" rel="dofollow">fendi purses</a>
<a href="http://www.fendihandbagsoutlets.com/" rel="dofollow">fendi zucca bag</a>
<a href="http://www.fendihandbagsoutlets.com/" rel="dofollow">fendi peekaboo</a>

fendi purses sale

February 14. 2012 04:18 AM

ray ban wayfarer

<a href="http://www.ukraybansunglasses.net/" rel="dofollow">ray ban aviators</a>
<a href="http://www.ukraybansunglasses.net/" rel="dofollow">ray ban wayfarer</a>
<a href="http://www.ukraybansunglasses.net/" rel="dofollow">ray ban wayfarers</a>

ray ban wayfarer

February 14. 2012 11:47 AM

north face sale

a href="http://www.inorthfacejackets.net/" rel="dofollow">north face outlet</a>

north face sale

February 14. 2012 11:58 PM

funny news

A person essentially help to make seriously articles I would state. This is the first
time I frequented your web page and thus far? I amazed with the research you made to create
this particular publish incredible. Excellent job!http://www.breakinglolz.com

funny news

February 15. 2012 04:24 AM

Beats By Dr Dre Custom

a href="http://www.inorthfacejackets.net/" rel="dofollow">north face sale</a>

Beats By Dr Dre Custom

February 15. 2012 09:09 AM

timberland boots men

A person essentially help to make seriously articles I would state.

timberland boots men

February 15. 2012 09:22 AM

timberland mens boots

And you, Stefan Matthew Wever, will not die tomorrow.

timberland mens boots

February 15. 2012 09:31 AM

timberland shoes

so his masterful senior season and the two-shutout doubleheader against Lincoln only got him as far as UC Santa Barbara -- a dot on the Division I map known more for gnarly surf breaks than championship hardball.

timberland shoes

February 16. 2012 03:21 AM

timberland boots outlet

You’re a very skilled blogger. I have joined your rss feed
and look forward to seeking more of your fantastic post. Also

timberland boots outlet

February 16. 2012 03:26 AM

Solo HD

I would like to join your blog anyway.

Solo HD

February 16. 2012 04:03 AM

vans shoes cheap

Everyone to recycle more and save the planet!

vans shoes cheap

February 16. 2012 04:14 AM

ralph lauren sale

but in general it is, IMHO, one of the best static programming

ralph lauren sale

February 16. 2012 04:56 AM

Ralph Lauren outlet

The top complaint in this year's survey was excessive wind noise, followed by noisy brakes.

Ralph Lauren outlet

February 16. 2012 04:58 AM

polo Ralph Lauren Coupons

Toyota Motor Corp. had eight winners at the segment level, the most of any automaker

polo Ralph Lauren Coupons

February 16. 2012 05:03 AM

polo Ralph Lauren Coupons

Consulting firm J.D. Power and Associates polled 31,000 owners of 2009 model-year vehicles and rated brands by the number of problems owners have experienced in the last 12 months. Problems can range from stalling engines and transmission issues to peeling paint and electronics glitches

polo Ralph Lauren Coupons

February 16. 2012 05:12 AM

christian louboutin uk

Ram and Jaguar all saw their scores fall from a year ago. Buick's score stayed the same.

christian louboutin uk

February 16. 2012 05:16 AM

ralph lauren sale

The top complaint in this year's survey was excessive wind noise, followed by noisy brakes

ralph lauren sale

February 16. 2012 11:18 AM

Oakley Sunglasses

Welcome to our website,there have <a href="http://www.oakleystores.com/">Oakley Sunglasses</a>,<a href="http://www.retrojordan5.com/">Jordan Shoes</a>,<a href="http://kissmonsterbeats.com/">Monster Beats</a> and <a href="http://www.cheapjerseysbase.com/">Jerseys For Cheap</a>,reasonable price,quality is guaranteed.

Oakley Sunglasses

February 16. 2012 02:24 PM

GTA 4 Cheats

It's that times in which usually you might want to retrieve the cell-phone as well as select 1 or also lots of  the well   five hundred provided gta 4 cheats!

GTA 4 Cheats

February 16. 2012 03:45 PM

Solar Power Ontario

Thanks for your blog, you are very interesting topics and modern, I really liked your blog.

Solar Power Ontario

February 17. 2012 04:12 AM

Lady Gaga Heartbeats

hen moved on to practice witchcraft with the combination of IronRuby and C#, and ended with the new and shiny .NET spell-book also known as project “Roslyn”.

Lady Gaga Heartbeats

February 17. 2012 02:53 PM

agence de communication

A communication design organization will be primarily dependable for disseminating the data effectively as well as regular towards the involved public and also celebrations.

agence de communication

February 18. 2012 07:19 AM

ray ban uk

<a href="http://www.ukraybansunglasses.net/" rel="dofollow">ray ban</a>
<a href="http://www.ukraybansunglasses.net/" rel="dofollow">ray ban sunglasses</a>
<a href="http://www.ukraybansunglasses.net/" rel="dofollow">ray ban parts</a>

ray ban uk

February 20. 2012 04:00 AM

fendi outlet

<a href="http://www.fendihandbagsoutlets.com/" rel="dofollow">fendi zucca bag</a>
<a href="http://www.fendihandbagsoutlets.com/" rel="dofollow">fendi peekaboo</a>
<a href="http://www.fendihandbagsoutlets.com/" rel="dofollow">fendi tote</a>
<a href="http://www.fendihandbagsoutlets.com/" rel="dofollow">fendi bag</a>
<a href="http://www.fendihandbagsoutlets.com/" rel="dofollow">fendi bags</a>
<a href="http://www.fendihandbagsoutlets.com/" rel="dofollow">fendi handbags</a>

fendi outlet

February 20. 2012 05:06 AM

timberland work boots

"This contraception thing, my gosh it's so inexpensive. Back in my day they used Bayer aspirin for contraceptives, the gals put it between their knees and it wasn't that costly," Friess said Thursday, while defending Rick Santorum's personal objections to contraception. Friess wrote on his blog that this is an "old joke" from 50 years ago before birth control pills were available. The joke refers to abstaining from sex as contraception.

timberland work boots

February 20. 2012 07:31 AM

rugby outlet online

"This contraception thing, my gosh it's so inexpensive. Back in my day they used Bayer aspirin for contraceptives, the gals put it between their knees and it wasn't that costly," Friess said Thursday, while defending Rick Santorum's personal objections to contraception. Friess wrote on his blog that this is an "old joke" from 50 years ago before birth control pills were available.

rugby outlet online

February 20. 2012 10:40 AM

ralph lauren kids outlet

know this feature isn’t going to disappear. Ever. I’m sure some people have found a reason to use it like there’s no tomorrow and Micros

ralph lauren kids outlet

February 20. 2012 12:22 PM

fendi peekaboo


<a href="http://www.fendihandbagsoutlets.com/" rel="dofollow">fendi handbag</a>
<a href="http://www.fendihandbagsoutlets.com/" rel="dofollow">fendi designer handbags</a>
<a href="http://www.fendihandbagsoutlets.com/" rel="dofollow">men fendi sunglasses</a>
<a href="http://www.fendihandbagsoutlets.com/" rel="dofollow">fendi glasses</a>
<a href="http://www.fendihandbagsoutlets.com/" rel="dofollow">fendi sunglass</a>
<a href="http://www.fendihandbagsoutlets.com/" rel="dofollow">fendi sunglasses 2011</a>
<a href="http://www.fendihandbagsoutlets.com/" rel="dofollow">fendi pumps</a>
<a href="http://www.fendihandbagsoutlets.com/" rel="dofollow">fendi shoes 2010</a>

fendi peekaboo

February 20. 2012 02:20 PM

Garages and Sheds

You have explained the “Method hiding” feature of c# in detail. I will use this method.

Garages and Sheds

February 21. 2012 09:05 AM

fleece jackets

<a href="http://www.inorthfacejackets.net/" rel="dofollow">northface jackets</a>
<a href="http://www.inorthfacejackets.net/" rel="dofollow">northface</a>

fleece jackets

February 21. 2012 09:51 AM

abercrombie outlet uk

<a href="http://www.classicafmall.com/" rel="dofollow">abercrombie and fitch</a>
<a href="http://www.classicafmall.com/" rel="dofollow">abercrombie & fitch</a>
<a href="http://www.classicafmall.com/" rel="dofollow">abercrombie uk sale</a>

abercrombie outlet uk

February 21. 2012 04:55 PM

Pinnacles tour perth

I've learned a lot in you blog.

Pinnacles tour perth

February 22. 2012 06:07 AM

abercrombie outlet

kkkkkkkkkkkkk

abercrombie outlet

February 22. 2012 06:34 AM

vans shoe

vans shoevans shoevans shoe是

vans shoe

February 22. 2012 10:16 AM

Kitchens Brisbane

What is the difference between c# and C++? There is little bit confusion in my mind.

Kitchens Brisbane

Add comment


(Will show your Gravatar icon)

  Country flag

biuquote
  • Comment
  • Preview
Loading



Subscribe Subscribe

That's Me!

Hi! I'm Shay Friedman
I'm Shay Friedman - a Visual C#/IronRuby MVP, a consultant and instructor of .NET technologies, author, speaker and new technologies freak
More about me

Contact Me

> Contact page
> Twitter: @ironshay
> LinkedIn profile

Search

Hosted By

I'm hosting this site on Arvixe and I'm very happy with it.
If you're looking for ASP.NET hosting, I highly recommend it
(and if you order from this link I also get some beer money!)
Web Hosting