domingo, 27 de junio de 2010

Split, función vs método

En VisualBasic.NET existen dos definiciones para la instrucción Split, una es un método y la otra una función que, si bien pienso que deberian funcionar exactamente igual, tienen sus particularidades.

La función Split está definida en el NameSpace Microsoft.VisualBasic mientras que el método Split se encuentra en el NameSpace System.String. En principio parece ser que el NameSpace Microsoft.VisualBasic se definió como un conjunto de instrucciones para facilitar la migración de aplicaciones hechas en versiones anteriores de VisualBasic a .NET por lo que debemos entender que es el método Split el que Microsoft propone para los nuevos desarrollos en .NET

Para quien no lo sepa Split se utiliza para dividir una cadena en subcadenas utilizando uno o varios caracteres como elemento de corte, es decir, si tenemos el texto "Texto1@Texto2@Texto3" podriamos obtener tres cadenas independientes "Texto1", "Texto2", "Texto3" llamando al método (o a la función) Split con @ como caracter de corte.


Utilizando ambos métodos se obtiene que:
SubCadenas(0) = "Texto1"
SubCadenas(1) = "Texto2"
SubCadenas(2) = "Texto3"

El problema es que, en ocasiones necesitamos especificar varios caracteres de corte, por ejemplo, si en lugar de @ tenemos dos caracteres, por ejemplo @& y la cadena de texto original fuera "Texto1@&Texto2@&Texto3" se supone que deberiamos obtener el mismo resultado llamando al método o a la función utilizando esos caracteres pero realmente obtenemos lo siguiente.


Con el método Cadena.Split("@&") el resultado es:
SubCadenas(0) = "Texto1"
SubCadenas(1) = "&Texto2"
SubCadenas(2) = "&Texto3"

Mientras que utilizando la función Split(Cadena, "@&") si se obtiene:
SubCadenas(0) = "Texto1"
SubCadenas(1) = "Texto2"
SubCadneas(2) = "Texto3"

¿A que se debe esta discrepancia? el problema es que el método Split acepta una variable de tipo caracter como parámetro, es decir, un único caracter por lo que al pasarle "@&" realemnte solo esta teniendo en cuenta el caracter @ mientras que & es despreciado.
La función Split si acepta un String como parámetro por lo que si se estan considerando ambos caracteres y su resultado es el esperado.

Realmente el método Split si tiene una sobrecarga en la que se puede indicar un valor de tipo String (realmente un array de strings) pero dicha sobrecarga, tiene, además, otro parámetro StringSplitOptions que, en este caso no nos interesa pero a no ser que lo especifiquemos no conseguiremos que el método Split funcione como deseamos así que la llamada correcta seria:


De esta forma el valor de SubCadenas si es el mismo que utilizando la función Split, es decir:
SubCadenas(0) = "Texto1"
SubCadenas(1) = "Texto2"
SubCadneas(2) = "Texto3"

Pienso que en la definición del método Split se les pasó por alto hacer una sobrecarga para permitir un parámetro String de forma similar a la función Split, por lo menos creo que es bastante más cómodo.

2 comentarios:

  1. Hola Fossie, qué tal?

    He llegado hasta aquí desde el blog "El escaparate de Rosa", a propósito de un comentario que dejaste allí en relación a un fallo de Blogger con los comentarios.

    El número total de comentarios no corresponde con el número que se muestra. Incluso mi último post marca cero cuando en realidad tengo uno.

    El link que dejaste en tu comentario ya no está operativo. Podrías ayudarme de alguna manera?

    Gracias de antemano!

    Fran.

    ResponderEliminar
  2. Gracias por escribir Francisco, te he escrito un correo comentandote el tema.

    ResponderEliminar