Tuesday, 23 February 2010

C# 3.0 Method Extenders

“Method Extenders” is one of the most useful features introduced in the third version of .Net, which allows us to extend the features of a pre-built class. This small post will show you why you want them, how to use them, and the different versions of .Net you will need to deploy.

Why you want extension methods? Just an example

Imagine a collection of the type HashTable or Dictionary. It is sometimes convenient to retrieve ANY element of the collection. You don’t want the first, you don’t want the last (it would be a non-sense talking about order in a hash table). You don’t want any element in special, just one. The default HashTable or Dictionary collections don’t have a GetAnyElement() method, so you would typically iterate through the collection getting the first element you find.
If this operation is done frequently over your code, and you are a clever developer, you won’t be duplicating the same piece of code all around, and you will end up with some sort of static code like this:
        public static string GetAnyValueOfDictionary(Dictionary<string, string> pDictionary)
        {
            foreach (string value in pDictionary.Values)
                return value;
            return "";
        }
This is nice, but… Wouldn’t it be muuuuuuch nicer if that method was shown as an instance method (automatically recognized by the IntelliSense) instead of a static one inside a different class?
That is what extension methods give you. Pretty much like ExtenderProviders do at design time, adding properties to controls, ExtensionMethods tell the environment that the GetAnyValue() method is in fact a part of the specific Dictionary instance, so the invocation to the method is through each instance, not through an additional class.
The following is the old way of doing this stuff. Create a static class with some utility methods, and invoke them:
            // Old fashioned
            Dictionary<string, string> myDictionary = new Dictionary<string, string>();
            string anyValue = DictionaryUtils.GetAnyValueOfDictionary(myDictionary);
This forces you to remember that there’s a DictionaryUtils class holding that code. Not anymore… This is the new way:
            // Extension Methods
            Dictionary<string, string> myDictionary = new Dictionary<string, string>();
            string anyValue = myDictionary.GetAnyValue();
Fancy uh?

What do I need to use them?

Theoretically, Extension Methods were introduced in .Net 3.0. However, if you try to use them directly, your compiler will say that needs a reference to System.Core.Dll. If you add that reference, you will realize that in fact is a .Net 3.5 dll. So, here you can follow two different paths:
1.- Add a reference to System.Core.Dll, deploy your application as .Net 3.5, and jump to the next chapter
2.- If deploying your application as .Net 3.5 is not an option, you can always add the following code snippet:
namespace System.Runtime.CompilerServices
{
    public class ExtensionAttribute : Attribute { }
}
This will allow the compiler to work with Extension Methods even in a .Net 2.0 application, as this blog post explains deeply.

How to write them?

Now you are ready to write your own extenders. Let’s see the example code for the GetAnyValue extension method:
 public static string GetAnyValue(this Dictionary<string, string> source)
        {
            foreach (string key in source.Values)
                return key;
            return "";
        }
As you can see, Method Extenders are written as static methods (inside a static class). Of course, you need a reference to the calling instance object, that’s why the infrequent word this appears in the parameters declaration.
The Type you specify on the right of the “this” keyword will state the kind of objects this method extends. Once you have the code, just add a “using” sentence (to the namespace you used for your “extenders” class) in every source file where you want to use them. Et voilá! Method extended… Easy as that:
image
Of course, you can combine this with Generics (using the <T> generic type), to make things even more functional.

Another useful example: A WordCount method for the string type

In this MSDN page, you can find another useful example: a WordCount method for the “string” type.
            public static int WordCount(this string str)
            {
                return str.Split(new char[] { ' ', '.', '?' }, StringSplitOptions.RemoveEmptyEntries).Length;
            }
Of course, you can put there your own split char preferences, but it’s indeed a handy method, isn’t it?
Take Care!

Wednesday, 10 February 2010

¿Qué sería de nosotros sin la ayuda de inte né?

Nunca me había sucedido esto. Qué gracia…

Resulta que no recordaba cómo implementar un tema en Windows Forms así que, como siempre, he buscado en google.

Lo gracioso ha sido cuando me he encontrado con que el resultado número 1 de google cuando buscas el término “owner draw listview keep selection” es un artículo…

¡escrito por mi!

Más concretamente, perteneciente a este mismo blog que estás leyendo, y que puedes encontrarlo aqui. Hay que joderse, se ve que llevamos ya unos añitos… Así que nada, a leer y a recordar…

Por lo menos esta vez me ahorro el comentario de agradecimiento al autor… ;)

Salud!

Monday, 8 February 2010

Detecting if a piece of code is running in Design Time

Sometimes, you will want to distinguish if a certain piece of your code is being executed at run-time or as a part of the Visual Studio Design-Time calls.

A very easy way of checking this is:

bool isDesignTime = (this.Site != null && this.Site.DesignMode == true);

Why to explain this?

This is something quite obvious, but some people ask in the forums why they are receiving an exception when trying to open the design view of a form, in Visual Studio. Those exceptions can be caused by many things, but the one explained here is one of the frequent reasons.

Use case

Imagine you have developed a custom UserControl class, which needs to do something everything it´s made visible. You will probably override the OnVisibleChanged event to perform that operation. Now, imagine that operation can only be done at runtime. For example, if you need in that operation some data to be loaded, data that won´t be available at Design-Time. Now, imagine that you insert that UserControl into one of your forms.

As you can probably imagine, each time you open that form in the Design View of VisualStudio, the overriden OnVisibleChanged event will be fired, and as that data is not available, you will receive an exception, ruining the initialization of the DesignView, and banning you from editing anything at design time in your form.

In such cases, using the above check will save you from this behavior. Just put that check in the OnVisibleChanged event, and use the mentioned data only if not in Design Time. Et voilá. You have design view operative again.

Cheers!

Friday, 5 February 2010

¿Neumáticos online? ¿Si o no?

Esta semana pasada por fin me decidí a probar el servicio de Neumáticos Online. Después de muchos años dudando, por culpa de los rumores (que si problemas, que si ruedas antiguas, etc.), un precio muy bajo equilibró la balanza a su favor.

Bridgestone Potenza RE050A

Iba a comprar dos ruedas de verano nuevas, modelo Bridgestone Potenza RE050 A, medida 245/45/R17 y código de velocidad Y. El modelo exacto, para los más “fanatics” es: Bridgestone Potenza RE 050 A 245/45 R17 95Y MZ

El precio normal de este neumático, supera fácilmente los 200€ por unidad, y en esa página web los ofrecían por 164€ IVA incluido. Así que dije… me voy a arriesgar, a ver qué tal…

El pedido fue muy cómodo, ya que permiten pago por PayPal, y a partir de ahí, estuve bien informado con emails sobre el estado del pedido. Una vez fueron enviados los neumáticos, me pasaron un “track link” para seguir la evolución del bulto, mientras estaba en poder de la compañía de transportes.

Hice el pedido el día 1 de Febrero de 2010. El día 2, las ruedas ya salieron desde Netherlands hacia Barcelona, donde llegaron el día 4. El día 5 de Febrero, o sea hoy, ya estaban en Pamplona, en el taller que escogí para que hicieran el montaje. “Todo bien”, me he dicho esta mañana, al menos por el momento…

Me acabo de pasar por el taller para ver las ruedas, y ahí ha llegado mi gran decepción. Código de fecha de fabricación: Semana 30, año 2008. Joder, ¡año y medio!…

En fin, como las ruedas me duran más o menos un año, morirán a primeros de 2011, con dos años y medio de antigüedad. No es que con ese tiempo los neumáticos resulten peligrosos, pero sí que, desde luego, no es su estado óptimo. 6 meses, 8 meses desde la fabricación… eso es normal. ¿Año y medio? Eso es… neumáticos online… De algún sitio tienen que sacar precios que nadie más ofrece…

Por último, tienes que tener en cuenta que el coste del montaje de la rueda no está incluido en el precio, y el coste que los talleres aplican por montaje no es barato precisamente cuando las ruedas se han comprado por Neuomáticos Online (suele rondar de media los 20€ por neumático). El taller que yo escogí cobra 25€ por rueda, así que en realidad las ruedas me costaron 190€ cada una.

Conclusión: me ahorré unos 35€ por rueda, a costa de montar unas ruedas que tienen más años que la mojama.

¿Merece la pena?  Eso dependerá de cada uno… En mi opinión: NO

Salud!

Wednesday, 3 February 2010

Travis Pastrana

Joder con Travis Pastrana. Este pavo debe de tener una de esas adicciones al peligro… Lo cierto es que le pega a todo: motocross, x-games, paracaidismo, skateboard, coches de rallyes… Conduce, pilota o monta casi cualquier cosa que se mueva. Y muy bien, por cierto. Como ya lleva unas cuantas proezas, vamos a hacer una recopilación:

1.- BackFlip en la MegaRamp… ¡con un triciclo de bebé!

Sobre este vídeo ya hablamos en este otro post. Lo curioso es que ahora me he encontrado con un vídeo más completo, donde se muestra no solo el tercer intento, sino también los dos primeros… Acojonante…

 

2.- BackFlip con una… ¡Harley Davidson!

Debió pensar que hacer un backflip en un triciclo, o con una moto de “solo” 100 Kg era una bobada. Necesitaba más inercia, así que duplicó o triplicó el peso… Lo que no sé es como aguantó la Harley el aterrizaje…

3.- BackFlip… ¡Doble!

Lo malo de llevar ya años haciendo BackFlips es que a la gente ya no le impresiona. Recuerdo la primera vez que lo vi en la tele… solo dije... “mi vieja!". Pero hoy en día ya es… ¡bah, otro backflip!. Como parece que a Pastrana le pitan los oídos cada vez que alguien dice eso, decidió ponerse manos a la obra...

4.- Saltar con una moto… ¡sobre el agua!

A este pavo ya se le queda pequeño todo… Debe ser que montar una moto en tierra ya le aburre, así que ha decidido cambiar de medio… Y no, no me refiero a que ahora monte motos de agua, sino que monta motos normales… ¡sobre el agua!

5.- También paracaidismo… ¡sin paracaídas!

Aquí es donde entenderéis lo de “adicto al peligro”. Habéis visto esa escena de James Bond donde se lanza de un avión sin paracaídas y alcanza a otro que está en el aire y si lo lleva para salvarse? A esa escena que tantas veces hemos visto en el cine le sobraba una cosa… los efectos especiales.

Después de esto, hacer un BackFlip a este le parece una chorramingada…

6.- Un coche es demasiado aburrido para el… ¡a no ser que sea para batir el record del mundo!

Lo dicho, record del mundo de salto con un coche: 269 pies (casi 82 metros) sobre un lago, aterrizando en una barcaza. A 150 km/h al encarar la rampa…

7.- El jardín trasero de Pastrana

Si la vida de este hombre es así, ya podéis imaginaros que su casa no es del todo… “normal”. Si queréis verle hacer un BackFlip, con su hija de 7 años de paquete en la moto, no os perdáis el siguiente vídeo…

8.- ¿Ganas de más?

Este, y otros tarados amigos suyos, hacen un programa en la MTV que se llama “Nitro Circus”, tratando de superar las pruebas más peligrosas, absurdas y graciosas que se les ocurren. Podéis seguir viendo sus hazañas en Nitro Circus Youtube Channel