Discussion:
Saber si un objeto esta instanciado
(demasiado antiguo para responder)
Pedro
2007-04-10 11:42:56 UTC
Permalink
Como saber si un objeto de determinado tipo (clase) se encuentra
instanciado?

Ej. public static bool ExisteObjeto(string cRutaObjeto)

//Ejemplo: bool ExisteMiobjeto=ExisteObjeto("Form1.MiObjeto")

Pedro
Alberto Poblacion
2007-04-10 12:09:17 UTC
Permalink
Post by Pedro
Como saber si un objeto de determinado tipo (clase) se encuentra
instanciado?
Ej. public static bool ExisteObjeto(string cRutaObjeto)
//Ejemplo: bool ExisteMiobjeto=ExisteObjeto("Form1.MiObjeto")
Me temo que estás confundiendo la clase con el objeto. Un objeto por
definición siempre está instanciado, sino no existe el objeto. Creo que la
pregunta que haces es en realidad "Cómo saber si existe alguna instancia de
una clase determinada". Ante la cual la respuesta es básicamente que "en
general no se puede".
Si solo creas en tu programa una única instancia (un solo objeto de esa
clase) y siempre usas una variable concreta para guardar la referencia a ese
objeto, entonces está instanciado siempre que la referencia no sea null.
Incluso aunque la referencia sea null, el objeto podría seguir instanciado
si el recogedor de basura todavía no lo ha destruido.
Si no sigues ningún criterio y guardas las referencias en cualquier
sitio, entonces la única forma de controlar las instancias es modificar el
fuente de la clase para que siga un modelo de tipo "Fatoría de objetos" y el
método-factoría junto con el Finalizador de la clase lleven internamente el
control de todas las instancias creadas.
Pedro
2007-04-10 12:35:09 UTC
Permalink
Quizas no me exprese bien. Es para un ambiente runtime.
Post by Alberto Poblacion
Post by Pedro
Como saber si un objeto de determinado tipo (clase) se encuentra
instanciado?
Ej. public static bool ExisteObjeto(string cRutaObjeto)
//Ejemplo: bool ExisteMiobjeto=ExisteObjeto("Form1.MiObjeto")
Me temo que estás confundiendo la clase con el objeto. Un objeto por
definición siempre está instanciado, sino no existe el objeto. Creo que la
pregunta que haces es en realidad "Cómo saber si existe alguna instancia
de una clase determinada".
Claro, mas o menos eso fue lo que quise preguntar solo que lo exprese mal.
Post by Alberto Poblacion
Ante la cual la respuesta es básicamente que "en general no se puede".
Si solo creas en tu programa una única instancia (un solo objeto de esa
clase) y siempre usas una variable concreta para guardar la referencia a
ese objeto, entonces está instanciado siempre que la referencia no sea
null. Incluso aunque la referencia sea null, el objeto podría seguir
instanciado si el recogedor de basura todavía no lo ha destruido.
Si no sigues ningún criterio y guardas las referencias en cualquier
sitio, entonces la única forma de controlar las instancias es modificar el
fuente de la clase para que siga un modelo de tipo "Fatoría de objetos" y
el método-factoría junto con el Finalizador de la clase lleven
internamente el control de todas las instancias creadas.
Realmente no voy tan lejos. Me explico con un ejemplo. Tengo una clase Form
y necesito desde uno de sus metodos preguntar (para usarse en runtime) si
dentro de ese form ya existe un objeto llamado MiObjeto (para el caso no me
interesa de que clase sea MiObjeto).
Uso esa informacion para tomar alguna decision en runtime dependiendo si el
objeto ya existe.

En Visual Foxpro yo hacia:

if VARTYPE(This.MiObjeto)<>"U" //"U"-Unknown...
...ya el objeto existe



Pedro
Alberto Poblacion
2007-04-10 13:06:05 UTC
Permalink
Post by Pedro
Quizas no me exprese bien. Es para un ambiente runtime.
¿A qué te refieres? ¿Qué es un "ambiente runtime"?
Post by Pedro
[...]
Realmente no voy tan lejos. Me explico con un ejemplo. Tengo una clase
Form y necesito desde uno de sus metodos preguntar (para usarse en
runtime) si dentro de ese form ya existe un objeto llamado MiObjeto
Una vez más, hay que preguntar que qué es lo que quieres decir con
"estar dentro de un form" un objeto. Los objetos no "están dentro" de ningún
form, sino dentro del Heap del motor de ejecución. En la Clase que define el
Form podría haber variables miembro de la clase que se usen para guardar
referencias a objetos, pero en ese caso lo que puedes hacer es ver si la
variable vale null.

¿Más que a Objetos, No te estarás refiriendo a Controles dentro del
Form? En ese caso sí que se puede saber si un determinado control pertenece
al form, porque el Form tiene una colección llamada Controls que puedes
recorrer y buscar en ella cualquier control que te intererse.
Alfredo Novoa
2007-04-10 13:11:04 UTC
Permalink
Post by Pedro
Tengo una clase Form
y necesito desde uno de sus metodos preguntar (para usarse en runtime) si
dentro de ese form ya existe un objeto llamado MiObjeto (para el caso no me
interesa de que clase sea MiObjeto).
if VARTYPE(This.MiObjeto)<>"U" //"U"-Unknown...
...ya el objeto existe
if (miFormulario.MiObjeto != null)
... el objeto ya existe


Saludos
Pedro
2007-04-10 13:30:56 UTC
Permalink
Post by Alfredo Novoa
Post by Pedro
if VARTYPE(This.MiObjeto)<>"U" //"U"-Unknown...
...ya el objeto existe
if (miFormulario.MiObjeto != null)
... el objeto ya existe
Bueno esa es la mejor aproximacion a lo que quiero, aunque me dio trabajo
expresarme:(. Solo que en VFP podia hacerlo aunque no existiese siquiera
"el puntero" MiObjeto. Veo que en C# tengo al menos que tener el objeto
definido aunque no se haya hecho el New MiClase() correspondiente.
Juan Diego Bueno
2007-04-10 13:46:55 UTC
Permalink
Post by Pedro
Post by Alfredo Novoa
Post by Pedro
if VARTYPE(This.MiObjeto)<>"U" //"U"-Unknown...
...ya el objeto existe
if (miFormulario.MiObjeto != null)
... el objeto ya existe
Bueno esa es la mejor aproximacion a lo que quiero, aunque me dio trabajo
expresarme:(. Solo que en VFP podia hacerlo aunque no existiese siquiera
"el puntero" MiObjeto. Veo que en C# tengo al menos que tener el objeto
definido aunque no se haya hecho el New MiClase() correspondiente.
Siempre te quedará el recurso de usar el patrón singleton y así tener
como mucho un ejemplar de la clase form que necesites (si es eso lo
que necesitas). Para ver el uso del singleton con formularios, busca
DefInstance en este mismo grupo

Saludos
Alfredo Novoa
2007-04-10 13:51:29 UTC
Permalink
Post by Pedro
Post by Alfredo Novoa
Post by Pedro
if VARTYPE(This.MiObjeto)<>"U" //"U"-Unknown...
...ya el objeto existe
if (miFormulario.MiObjeto != null)
... el objeto ya existe
Bueno esa es la mejor aproximacion a lo que quiero, aunque me dio trabajo
expresarme:(. Solo que en VFP podia hacerlo aunque no existiese siquiera
"el puntero" MiObjeto. Veo que en C# tengo al menos que tener el objeto
definido aunque no se haya hecho el New MiClase() correspondiente.
Si no sabes como se llama la variable puntero en tiempo de compilación
puedes usar la reflexión.


Saludos
Jose Camacho Vaca
2007-04-10 15:38:05 UTC
Permalink
El VARTYPE() de VFP no existe en C#, una de las cosas buenas del mundo de Fox
que no tiene .Net. Hay que tener paciencia, ya madurará. Yo no he
encontrado la forma de hacer lo que hace el VARTYPE(), por ejemplo si haces
una comprobación:

if (miFormulario.miVariableObjeto != null)
a veces no funciona, como el garbage collector no siempre funciona igual, y
te puede dar resultados inesperados. Y si nos metemos en programción de
patrones de diseño es mas trabajo. Espero que encuentres la solución.
Saludos.
--
José Camacho Vaca
Colima, MX
Post by Pedro
Quizas no me exprese bien. Es para un ambiente runtime.
Post by Alberto Poblacion
Post by Pedro
Como saber si un objeto de determinado tipo (clase) se encuentra
instanciado?
Ej. public static bool ExisteObjeto(string cRutaObjeto)
//Ejemplo: bool ExisteMiobjeto=ExisteObjeto("Form1.MiObjeto")
Me temo que estás confundiendo la clase con el objeto. Un objeto por
definición siempre está instanciado, sino no existe el objeto. Creo que la
pregunta que haces es en realidad "Cómo saber si existe alguna instancia
de una clase determinada".
Claro, mas o menos eso fue lo que quise preguntar solo que lo exprese mal.
Post by Alberto Poblacion
Ante la cual la respuesta es básicamente que "en general no se puede".
Si solo creas en tu programa una única instancia (un solo objeto de esa
clase) y siempre usas una variable concreta para guardar la referencia a
ese objeto, entonces está instanciado siempre que la referencia no sea
null. Incluso aunque la referencia sea null, el objeto podría seguir
instanciado si el recogedor de basura todavía no lo ha destruido.
Si no sigues ningún criterio y guardas las referencias en cualquier
sitio, entonces la única forma de controlar las instancias es modificar el
fuente de la clase para que siga un modelo de tipo "Fatoría de objetos" y
el método-factoría junto con el Finalizador de la clase lleven
internamente el control de todas las instancias creadas.
Realmente no voy tan lejos. Me explico con un ejemplo. Tengo una clase Form
y necesito desde uno de sus metodos preguntar (para usarse en runtime) si
dentro de ese form ya existe un objeto llamado MiObjeto (para el caso no me
interesa de que clase sea MiObjeto).
Uso esa informacion para tomar alguna decision en runtime dependiendo si el
objeto ya existe.
if VARTYPE(This.MiObjeto)<>"U" //"U"-Unknown...
....ya el objeto existe
Pedro
Alfredo Novoa
2007-04-10 15:50:47 UTC
Permalink
On Tue, 10 Apr 2007 08:38:05 -0700, Jose Camacho Vaca
Post by Jose Camacho Vaca
if (miFormulario.miVariableObjeto != null)
a veces no funciona, como el garbage collector no siempre funciona igual, y
te puede dar resultados inesperados.
No es cierto. Si que funciona, lo que pasa es que tienes que conocer
el nombre de la variable en tiempo de compilación.


Saludos
Alfredo Novoa
2007-04-10 13:08:08 UTC
Permalink
On Tue, 10 Apr 2007 14:09:17 +0200, "Alberto Poblacion"
Post by Alberto Poblacion
Me temo que estás confundiendo la clase con el objeto. Un objeto por
definición siempre está instanciado, sino no existe el objeto.
Primero "instanciar" e "instanciado" no existen en español, y no está
nada claro que es lo que quiere decir la gente que usa esos engendros
de palabras.

Y segundo, no hay ningún estandar sobre lo que significa objeto, así
que alguien podría perfectamente decir que en:

string s = null;

"s" es un objeto no inicializado. Que creo que es a lo que se refiere
Pedro.


Saludos
Alberto Poblacion
2007-04-10 13:53:45 UTC
Permalink
Post by Alfredo Novoa
Primero "instanciar" e "instanciado" no existen en español, y no está
Cierto, en el diccionario de la RAE no está, pero la pregunta original
era "Saber si un objeto esta instanciado". Responder a la pregunta
simplemente diciendo que esa palabra no existe es bastante poco útil para el
que realiza la pregunta. Y ya puestos a contestarla, ¿por qué no usar en la
respuesta el mismo término que utilizó el autor original, aunque sea un
barbarismo derivado del inglés "instance"?
Post by Alfredo Novoa
Y segundo, no hay ningún estandar sobre lo que significa objeto, así
string s = null;
"s" es un objeto no inicializado. Que creo que es a lo que se refiere
Justo, "s" es lo que en mi explicación yo he llamado "una referencia a
un objeto", y efectivamente le decía que si así es como lo tiene, podía
compararlo con null.

El afán de diferenciar entre la referencia y el objeto en sí se debe a
que si haces por ejemplo:
string s="Pepe";
string t=s;
entonces tenemos dos referencias, "s" y "t", que apuntan al mismo objeto
("Pepe") del cual solo existe una instancia en memoria. Es solo una cuestión
de nomenclatura, pero de alguna forma hay que distinguir entre las dos
cosas. Por ejemplo, ¿qué pasa si ahora hacemos s=null;? ¿Está instanciado el
objeto? "Pepe" sigue en memoria, y se puede alcanzar a través de la
referencia "t", a pesar de que s vale null. Si a "s" y "t" les llamamos
objetos, igual que a "Pepe", se vuelve muy complejo expresar a qué nos
estams refiriendo realmente cuando hablamos de estas cosas. No tengo
inconveniente en llamarles objetos si lo crees oportuno, pero pienso que
resulta más práctico hacer la distinción entre referencias y objetos.
Hector
2007-04-10 14:21:50 UTC
Permalink
Post by Alberto Poblacion
Cierto, en el diccionario de la RAE no está, pero la pregunta original
era "Saber si un objeto esta instanciado". Responder a la pregunta
simplemente diciendo que esa palabra no existe es bastante poco útil para
el que realiza la pregunta. Y ya puestos a contestarla, ¿por qué no usar
en la respuesta el mismo término que utilizó el autor original, aunque sea
un barbarismo derivado del inglés "instance"?
"Instanciar" no existe en castellano igual que "Accesar" no existe tampoco.
Debe haber muchas mas palabras que son muy usadas en informatica (y
especificamente en la programacion) que vienen del ingles y no existen en
castellano.
Ahora bien, son globalmente aceptadas como parte de la jerga tecnica de la
informatica. Pienso que en otras profesiones pasa igual.
En resumen, la verdad que no veo tanta complicacion que un compañero haga
una pregunta usando ese termino, estoy seguro que la mayoria entendimos a
que el se referia aunque no lo expresara tecnicamente correcto.
No seamos tan estrictos con la gente que quiere aprender.
Alfredo Novoa
2007-04-10 16:33:05 UTC
Permalink
Post by Hector
"Instanciar" no existe en castellano igual que "Accesar" no existe tampoco.
"Accesar" es una monstruosidad. Aun peor que "instanciar". En español
es acceder.

"Accesar" suena tan mal como "grilla", "alocar", "setear", etc.
Post by Hector
En resumen, la verdad que no veo tanta complicacion que un compañero haga
una pregunta usando ese termino, estoy seguro que la mayoria entendimos a
que el se referia aunque no lo expresara tecnicamente correcto.
Dudo bastante que la mayoría sea capaz de definir el término
"instanciar".


Saludos
principiante
2007-04-10 18:02:34 UTC
Permalink
Post by Alfredo Novoa
Dudo bastante que la mayoría sea capaz de definir el término
"instanciar".
Estoy de acuerdo que definirlo no, pero creo como Hector que la gran mayoria
entendimos a qué se referia Pedro, incluyendome a mi que soy un novato en
esto de los objetos.

Tomado del prologo a la edicion española del libro "Patrones de Diseño"
(traduccion de Fernandez Acebal / Cueva Lovelle):

"Por otro lado, nunca resulta sencillo traducir un libro técnico en
informática. Numerosos barbarismos se han instalado ya en el idioma, de tal
forma que resulta difícil a veces optar entre lo que sería el término
correcto en español o el equivalente comúnmente aceptado por la comunidad de
la ingeniería del software. Uno de los ejemplos más evidentes lo constituye
la palabra instancia, para designar cada uno de los objetos creados de una
clase dada, y que en español tal vez debiera haberse traducido como
ejemplar. No obstante, pocas palabras hay más conocidas que ésta en la jerga
de la orientación a objetos, por lo que pretender cambiarla a estas alturas
habría sido un acto de vanidad por nuestra parte que sólo habría contribuido
a incrementar la confusión y dificultar la comprensión del libro. En otras
ocasiones, nos encontramos con palabras como framework o toolkit que hemos
dejado sin traducir por el mismo motivo: el lector técnico está acostumbrado
a ellas, por lo que de haberlas traducido probablemente no supiese a qué se
está haciendo referencia, desvirtuando así el sentido del original."


José TH
Alfredo Novoa
2007-04-10 18:19:28 UTC
Permalink
Post by principiante
Post by Alfredo Novoa
Dudo bastante que la mayoría sea capaz de definir el término
"instanciar".
Estoy de acuerdo que definirlo no, pero creo como Hector que la gran mayoria
entendimos a qué se referia Pedro, incluyendome a mi que soy un novato en
esto de los objetos.
Como decía mi profesor de lengua: si no lo sabes definir no lo
entiendes.
Post by principiante
Uno de los ejemplos más evidentes lo constituye
la palabra instancia, para designar cada uno de los objetos creados de una
clase dada, y que en español tal vez debiera haberse traducido como
ejemplar.
Efectivamente.
Post by principiante
No obstante, pocas palabras hay más conocidas que ésta en la jerga
de la orientación a objetos, por lo que pretender cambiarla a estas alturas
habría sido un acto de vanidad por nuestra parte que sólo habría contribuido
a incrementar la confusión y dificultar la comprensión del libro.
Esto es una tontería. ¿Como va a dificultar la comprensión el usar el
término correcto que todos conocen?

Más bien lo que dificultaría sería la habitual no comprensión del
término.
Post by principiante
En otras
ocasiones, nos encontramos con palabras como framework o toolkit que hemos
dejado sin traducir por el mismo motivo: el lector técnico está acostumbrado
a ellas, por lo que de haberlas traducido probablemente no supiese a qué se
está haciendo referencia, desvirtuando así el sentido del original."
Esto es distinto por que se usa el término inglés sin modificar. Si en
lugar de toolkit pusiesen "kit de tul" entonces sería como lo de
instancia :-)


Saludos
principiante
2007-04-10 19:26:29 UTC
Permalink
Esta bien, utiliza "ejemplar" que todos te entenderemos perfectamente... :)


José TH
Post by Alfredo Novoa
Post by principiante
Post by Alfredo Novoa
Dudo bastante que la mayoría sea capaz de definir el término
"instanciar".
Estoy de acuerdo que definirlo no, pero creo como Hector que la gran mayoria
entendimos a qué se referia Pedro, incluyendome a mi que soy un novato en
esto de los objetos.
Como decía mi profesor de lengua: si no lo sabes definir no lo
entiendes.
Post by principiante
Uno de los ejemplos más evidentes lo constituye
la palabra instancia, para designar cada uno de los objetos creados de una
clase dada, y que en español tal vez debiera haberse traducido como
ejemplar.
Efectivamente.
Post by principiante
No obstante, pocas palabras hay más conocidas que ésta en la jerga
de la orientación a objetos, por lo que pretender cambiarla a estas alturas
habría sido un acto de vanidad por nuestra parte que sólo habría contribuido
a incrementar la confusión y dificultar la comprensión del libro.
Esto es una tontería. ¿Como va a dificultar la comprensión el usar el
término correcto que todos conocen?
Más bien lo que dificultaría sería la habitual no comprensión del
término.
Post by principiante
En otras
ocasiones, nos encontramos con palabras como framework o toolkit que hemos
dejado sin traducir por el mismo motivo: el lector técnico está acostumbrado
a ellas, por lo que de haberlas traducido probablemente no supiese a qué se
está haciendo referencia, desvirtuando así el sentido del original."
Esto es distinto por que se usa el término inglés sin modificar. Si en
lugar de toolkit pusiesen "kit de tul" entonces sería como lo de
instancia :-)
Saludos
Alfredo Novoa
2007-04-10 22:26:06 UTC
Permalink
Post by principiante
Esta bien, utiliza "ejemplar" que todos te entenderemos perfectamente... :)
Tampoco es muy buen término. Es mejor decir valor o variable cuando
corresponda.


Saludos
ANT1
2007-04-10 14:30:58 UTC
Permalink
Perdon que me meta. Pero una duda relacionada con las referencias y
los objetos.

Cuando se pasan los parametros que sean a un metodo, por ejemplo:

public void Imprimir(string x){}

¿que le estamos pasando un clon del objeto o una referencia a este?

Mi duda en concreto, si yo al metodo "Imprimir" le paso la referencia
's' como la que ha puesto alberto en su ejemplo (string s = "Pepe";) y
dentro del metodo modifico 'x' (parametro de entrada) ¿se modifica el
objeto al que referencia 's'?

Un saludo


On 10 abr, 15:53, "Alberto Poblacion" <earthling-
Post by Alberto Poblacion
Post by Alfredo Novoa
Primero "instanciar" e "instanciado" no existen en español, y no está
Cierto, en el diccionario de la RAE no está, pero la pregunta original
era "Saber si un objeto esta instanciado". Responder a la pregunta
simplemente diciendo que esa palabra no existe es bastante poco útil para el
que realiza la pregunta. Y ya puestos a contestarla, ¿por qué no usar en la
respuesta el mismo término que utilizó el autor original, aunque sea un
barbarismo derivado del inglés "instance"?
Post by Alfredo Novoa
Y segundo, no hay ningún estandar sobre lo que significa objeto, así
string s = null;
"s" es un objeto no inicializado. Que creo que es a lo que se refiere
Justo, "s" es lo que en mi explicación yo he llamado "una referencia a
un objeto", y efectivamente le decía que si así es como lo tiene, podía
compararlo con null.
El afán de diferenciar entre la referencia y el objeto en sí se debe a
string s="Pepe";
string t=s;
entonces tenemos dos referencias, "s" y "t", que apuntan al mismo objeto
("Pepe") del cual solo existe una instancia en memoria. Es solo una cuestión
de nomenclatura, pero de alguna forma hay que distinguir entre las dos
cosas. Por ejemplo, ¿qué pasa si ahora hacemos s=null;? ¿Está instanciado el
objeto? "Pepe" sigue en memoria, y se puede alcanzar a través de la
referencia "t", a pesar de que s vale null. Si a "s" y "t" les llamamos
objetos, igual que a "Pepe", se vuelve muy complejo expresar a qué nos
estams refiriendo realmente cuando hablamos de estas cosas. No tengo
inconveniente en llamarles objetos si lo crees oportuno, pero pienso que
resulta más práctico hacer la distinción entre referencias y objetos.
Alfredo Novoa
2007-04-10 14:50:48 UTC
Permalink
Post by ANT1
Perdon que me meta. Pero una duda relacionada con las referencias y
los objetos.
public void Imprimir(string x){}
¿que le estamos pasando un clon del objeto o una referencia a este?
Una referencia (puntero).
Post by ANT1
Mi duda en concreto, si yo al metodo "Imprimir" le paso la referencia
's' como la que ha puesto alberto en su ejemplo (string s = "Pepe";) y
dentro del metodo modifico 'x' (parametro de entrada) ¿se modifica el
objeto al que referencia 's'?
Si.


Saludos
ANT1
2007-04-10 15:04:59 UTC
Permalink
Gracias Alfredo.
Post by Alfredo Novoa
Post by ANT1
Perdon que me meta. Pero una duda relacionada con las referencias y
los objetos.
public void Imprimir(string x){}
¿que le estamos pasando un clon del objeto o una referencia a este?
Una referencia (puntero).
Post by ANT1
Mi duda en concreto, si yo al metodo "Imprimir" le paso la referencia
's' como la que ha puesto alberto en su ejemplo (string s = "Pepe";) y
dentro del metodo modifico 'x' (parametro de entrada) ¿se modifica el
objeto al que referencia 's'?
Si.
Saludos
Alfredo Novoa
2007-04-10 15:20:17 UTC
Permalink
Post by ANT1
Mi duda en concreto, si yo al metodo "Imprimir" le paso la referencia
's' como la que ha puesto alberto en su ejemplo (string s = "Pepe";) y
dentro del metodo modifico 'x' (parametro de entrada) ¿se modifica el
objeto al que referencia 's'?
Si.
Bueno, lo que pasa es que los objetos string son inmutables y no hay
forma de modificarlos. Si modificas x lo que modificas no es el
objeto, es la referencia, por lo que el objeto al que referencia 's'
sigue igual.

Si fuese con un objeto normal entonces si se modificaría.


Saludos
Juan Diego Bueno
2007-04-10 15:28:27 UTC
Permalink
Osea, que si lo que quieres es modificar un string (que creo que es lo
que en C# se llaman tipos-valor) tendrás que usar la cláusula ref:

void Imprimir(ref string X);

Así pasas la cadena por referencia, en vez de por valor, que es la
opción por defecto. De esta forma si podría cambiarte el valor la
función.

Saludos
Post by Alfredo Novoa
Post by ANT1
Mi duda en concreto, si yo al metodo "Imprimir" le paso la referencia
's' como la que ha puesto alberto en su ejemplo (string s = "Pepe";) y
dentro del metodo modifico 'x' (parametro de entrada) ¿se modifica el
objeto al que referencia 's'?
Si.
Bueno, lo que pasa es que los objetos string son inmutables y no hay
forma de modificarlos. Si modificas x lo que modificas no es el
objeto, es la referencia, por lo que el objeto al que referencia 's'
sigue igual.
Si fuese con un objeto normal entonces si se modificaría.
Saludos
Alfredo Novoa
2007-04-10 15:40:14 UTC
Permalink
On 10 Apr 2007 08:28:27 -0700, "Juan Diego Bueno"
Post by Juan Diego Bueno
Osea, que si lo que quieres es modificar un string (que creo que es lo
void Imprimir(ref string X);
Así pasas la cadena por referencia, en vez de por valor, que es la
opción por defecto. De esta forma si podría cambiarte el valor la
función.
Si, pero lo que haces pasar la variable referencia por referencia :-)

El "objeto" original no se modifica sino que se pierde la referencia,
y si no hay más referencias entonces podrá ser reciclado por el
recolector de basura.

Eso dependiendo de lo que cada uno entienda por objeto, claro.


Saludos
Juan Diego Bueno
2007-04-10 15:47:14 UTC
Permalink
Post by Alfredo Novoa
Si, pero lo que haces pasar la variable referencia por referencia :-)
El "objeto" original no se modifica sino que se pierde la referencia,
y si no hay más referencias entonces podrá ser reciclado por el
recolector de basura.
Eso dependiendo de lo que cada uno entienda por objeto, claro.
Saludos
Ya, es que es la chufla de tratar un tipo-referencia como tipo-valor
(a medias).

En el libro Professional C# explica algo como:

En el código:

string s1="una cadena";
string s2=s1;

Cuando se inicializa una cadena s1 con el valor "una cadena", un nuevo
objeto cadena es reservado en la memoria dinámica. Cuando se
inicializa s2, la referencia apunta a este mismo objeto, por lo que s2
también valdrá "una cadena". Sin embargo, cuando cambiamos el valor de
s1, en lugar de reemplazarse el valor original, se creará un nuevo
objeto en la memoria dinámica para el nuevo valor. La variable s2
todavía apuntará al objeto original, de manera que su valor se
mantiene inalterado

Saludos
ANT1
2007-04-10 15:29:11 UTC
Permalink
Post by Alfredo Novoa
Bueno, lo que pasa es que los objetos string son inmutables y no hay
forma de modificarlos. Si modificas x lo que modificas no es el
objeto, es la referencia, por lo que el objeto al que referencia 's'
sigue igual.
Si fuese con un objeto normal entonces si se modificaría.
Saludos
¿Y por que de esa diferencia entre objetos string y los demas?
Juan Diego Bueno
2007-04-10 15:35:03 UTC
Permalink
Post by ANT1
Post by Alfredo Novoa
Bueno, lo que pasa es que los objetos string son inmutables y no hay
forma de modificarlos. Si modificas x lo que modificas no es el
objeto, es la referencia, por lo que el objeto al que referencia 's'
sigue igual.
Si fuese con un objeto normal entonces si se modificaría.
Saludos
¿Y por que de esa diferencia entre objetos string y los demas?
http://www.elguille.info/NET/cursoCSharpErik/Entrega3/Entrega3.htm

Mira donde pone: Sistema de Tipos en C#

Saludos
Juan Diego Bueno
2007-04-10 15:39:49 UTC
Permalink
Post by Juan Diego Bueno
Post by ANT1
Post by Alfredo Novoa
Bueno, lo que pasa es que los objetos string son inmutables y no hay
forma de modificarlos. Si modificas x lo que modificas no es el
objeto, es la referencia, por lo que el objeto al que referencia 's'
sigue igual.
Si fuese con un objeto normal entonces si se modificaría.
Saludos
¿Y por que de esa diferencia entre objetos string y los demas?
http://www.elguille.info/NET/cursoCSharpErik/Entrega3/Entrega3.htm
Mira donde pone: Sistema de Tipos en C#
Ui, perdón por la gambaza porque encima String se considera un tipo
referencia... aceptaremos lo de aborto de RFOG (pero bueno, ya que
estás, lee sobre el tema y tal)

Saludos
Alfredo Novoa
2007-04-10 15:34:09 UTC
Permalink
Post by ANT1
Post by Alfredo Novoa
Bueno, lo que pasa es que los objetos string son inmutables y no hay
forma de modificarlos. Si modificas x lo que modificas no es el
objeto, es la referencia, por lo que el objeto al que referencia 's'
sigue igual.
Si fuese con un objeto normal entonces si se modificaría.
Saludos
¿Y por que de esa diferencia entre objetos string y los demas?
Como diría RFOG por que C# es un aborto :-)

Es por que así les era más fácil implementar los strings.


Saludos
Carlos M. Calvelo
2007-04-10 17:10:44 UTC
Permalink
Post by Alfredo Novoa
Post by ANT1
Post by Alfredo Novoa
Bueno, lo que pasa es que los objetos string son inmutables y no hay
forma de modificarlos. Si modificas x lo que modificas no es el
objeto, es la referencia, por lo que el objeto al que referencia 's'
sigue igual.
Si fuese con un objeto normal entonces si se modificaría.
Saludos
¿Y por que de esa diferencia entre objetos string y los demas?
Como diría RFOG por que C# es un aborto :-)
Es por que así les era más fácil implementar los strings.
Saludos
Hola Alfredo,

Es la firma del copión. Copiaron el String y el StringBuffer de Java.
Es también la firma del que copia lo que es popular sin
importarle demasiado si es un buen diseño o no, porque uno
también quiere ser *popular*.

Saludos,
Carlos
Octavio Hernandez
2007-04-10 22:15:25 UTC
Permalink
Carlos,
Post by Carlos M. Calvelo
Copiaron el String y el StringBuffer de Java.
Bueno, hay que seguir los buenos ejemplos, no?
Eso sí, intentando mejorar. Por eso por ejemplo en .NET definieron el
operador == de manera
distinta, para q fuera posible decir if (s1 == s2) en vez de if
(s1.equals(s2)) como hay que hacer
en Java. Aunque admito que eso podría no gustarle a muchos, por las razones
q se han comentado
antes en este hilo.

En estas cosas es difícil ya a estas alturas innovar espectacularmente. Yo
creo q Java tampoco
inventó mucho con las cadenas, ya desde Smalltalk se vio que las cadenas
como tipos referencia
pueden causar problemas de rendimiento, y por eso se añadieron los Symbols y
los Streams:

http://www.ifi.unizh.ch/richter/Classes/oose2/01_Collections/03_smalltalk/03_smalltalk.html

Y en los lenguajes de Hejlsberg, ya desde Delphi 2 (1996, cuando Java era
aún "de juguete")
se añadieron las cadenas por referencia con recolección automática...

Un saludo,

Octavio
Alfredo Novoa
2007-04-10 23:55:46 UTC
Permalink
Hola Octavio,

On Wed, 11 Apr 2007 00:15:25 +0200, "Octavio Hernandez"
Post by Octavio Hernandez
Post by Carlos M. Calvelo
Copiaron el String y el StringBuffer de Java.
Bueno, hay que seguir los buenos ejemplos, no?
Más bien han copiado a saco, lo bueno y lo malo.
Post by Octavio Hernandez
En estas cosas es difícil ya a estas alturas innovar espectacularmente.
Justo en esta cosa no, pero en otras si se puede.
Post by Octavio Hernandez
Yo
creo q Java tampoco
inventó mucho con las cadenas, ya desde Smalltalk se vio que las cadenas
como tipos referencia
pueden causar problemas de rendimiento, y por eso se añadieron los Symbols y
http://www.ifi.unizh.ch/richter/Classes/oose2/01_Collections/03_smalltalk/03_smalltalk.html
Si hay problemas de rendimiento eso es solo por una mala
implementación.


Saludos
Octavio Hernandez
2007-04-11 00:51:53 UTC
Permalink
Qué tal, Alfredo!
Post by Alfredo Novoa
Más bien han copiado a saco, lo bueno y lo malo.
Bueno, yo he puesto un ejemplo de algo q no han copiado.
¿Qué es para tí lo malo de las cadenas de Java? (curiosidad)

Slds - Octavio
Alfredo Novoa
2007-04-11 06:57:17 UTC
Permalink
Hola Octavio,

On Wed, 11 Apr 2007 02:51:53 +0200, "Octavio Hernandez"
Post by Octavio Hernandez
Post by Alfredo Novoa
Más bien han copiado a saco, lo bueno y lo malo.
Bueno, yo he puesto un ejemplo de algo q no han copiado.
¿Qué es para tí lo malo de las cadenas de Java? (curiosidad)
Que son inmutables (en Delphi no lo eran) y que no funcionan como los
tipos primitivos, por ejemplo.

Pero me refería a que han fusilado Java en general.

Saludos
Octavio Hernandez
2007-04-11 09:00:06 UTC
Permalink
Alfredo,
Post by Alfredo Novoa
Que son inmutables (en Delphi no lo eran)
Efectivamente no lo son, en el sentido de q puedes decir

nombre[3] := 'X';

y la sustitución se hace in situ, pero la concatenación (que debe ser
la operación de transformación más común, probablemte) sí que se
hace creando un nuevo objeto en el heap...
Post by Alfredo Novoa
Pero me refería a que han fusilado Java en general.
Efectivamte, se parecen mucho. Es innegable q Java ha sido un hito
importante en esto de los lenguajes. Aunque a Java le faltaban cosas
relativas al modelo de componentes (propiedades y eventos) que
salieron de Delphi, creo.

Slds - Octavio
Alfredo Novoa
2007-04-11 09:53:04 UTC
Permalink
Hola Octavio,

On Wed, 11 Apr 2007 11:00:06 +0200, "Octavio Hernandez"
Post by Octavio Hernandez
Post by Alfredo Novoa
Que son inmutables (en Delphi no lo eran)
Efectivamente no lo son, en el sentido de q puedes decir
nombre[3] := 'X';
Compara esto con su equivalente Java o C# para una cadena grande.
Post by Octavio Hernandez
y la sustitución se hace in situ, pero la concatenación (que debe ser
la operación de transformación más común, probablemte) sí que se
hace creando un nuevo objeto en el heap...
Pero siempre te podías crear tu propio procedimiento de concatenación
que no tenía que crear ningún objeto nuevo.
Post by Octavio Hernandez
Post by Alfredo Novoa
Pero me refería a que han fusilado Java en general.
Efectivamte, se parecen mucho. Es innegable q Java ha sido un hito
importante en esto de los lenguajes.
Un hito comercial. Técnicamente no aporta nada nuevo y es un lenguaje
bastante mediocre.
Post by Octavio Hernandez
Aunque a Java le faltaban cosas
relativas al modelo de componentes (propiedades y eventos) que
salieron de Delphi, creo.
Si, claro. No solo copiaron de Java }:-)


Saludos
Carlos M. Calvelo
2007-04-11 21:35:53 UTC
Permalink
Hola Octavio,
Post by Octavio Hernandez
Carlos,
Post by Carlos M. Calvelo
Copiaron el String y el StringBuffer de Java.
Bueno, hay que seguir los buenos ejemplos, no?
Eso sí, intentando mejorar.
Para mi lo mejor sería tener solo un tipo String.
Si después una implementación (compilador y máquina virtual)
decide optimizar esto o lo otro, mejor. Pero sin
cambiar o complicar para eso el lenguaje.
Post by Octavio Hernandez
Por eso por ejemplo en .NET definieron el
operador == de manera
distinta, para q fuera posible decir if (s1 == s2) en vez de if
(s1.equals(s2)) como hay que hacer
en Java. Aunque admito que eso podría no gustarle a muchos, por las razones
q se han comentado
antes en este hilo.
Claro, el significado del == depende entonces de los tipos/clases
y eso embrolla el lenguaje. Determinar la igualdad de valores
en distintas variables es un concepto muy básico en programación
y debería ser consistente.
Post by Octavio Hernandez
En estas cosas es difícil ya a estas alturas innovar espectacularmente. Yo
creo q Java tampoco
inventó mucho con las cadenas, ya desde Smalltalk se vio que las cadenas
como tipos referencia
pueden causar problemas de rendimiento, y por eso se añadieron los Symbols y
Bueno, yo me imagino un lenguaje donde solo haya un 'tipo' de
tipos, valga la redundancia; que se comporten de manera uniforme.
Los problemas de rendimiento no deberían ser solucionados en el
diseño de un lenguaje sino en la implementación para quitar de
en medio esta carga administrativa a los programadores.
Por ejemplo en C# no tendría porque haber una diferenciación
entre tipos primitivos y clases en el lenguaje. Sí podría
la implementación (compilador) 'ser consciente' de algunos tipos
y sus operaciones y optimizar; lo que se le impone ahora al
programador al tener que aprender un lenguaje más complicado.
El programador no tendría por qué ser consciente de ello.

Mejor aun, me imagino un sistema de tipos común y externo a
todos los componentes que puedan formar parte de un sistema.
Así si yo digo por ejemplo en una base de datos que Nombre
es un String no tengo por que volver a decirlo en las
aplicaciones que usan ese dato; y si lo tengo que decir,
por lo menos que sea el mismo tipo String.
Lo que es un String estaría definido fuera del lenguaje
de programación, fuera del sgbd y fuera de cualquier otro
componente que pueda formar parte del sistema. Esto sería
especialmente importante para todos aquellos datos que pasan
de unos componentes a otros por medio de alguna interfaz.

Bueno.. basta de visiones de futuro :)
Post by Octavio Hernandez
http://www.ifi.unizh.ch/richter/Classes/oose2/01_Collections/03_small...
Y en los lenguajes de Hejlsberg, ya desde Delphi 2 (1996, cuando Java era
aún "de juguete")
se añadieron las cadenas por referencia con recolección automática...
Tampoco es que Java haya inventado todo esto. En realidad no hay
nada nuevo en Java. Lo más positivo, creo yo, es que ha popularizado
(por fin!) la recolección automática, de la que ya había otras
implementaciones ya hacía muchos años.
Lo que parece triste es que una idea ya lleva ahí *casi 50 años!*;
de repente aparecen implementaciones por todos los lados solo porque
unos imitan a otros y no porque estaban muy preocupados con el
hecho de que los programadores llevan años y años gestionando
memoria 'a mano'.

Saludos,
Carlos
Alfredo Novoa
2007-04-12 09:49:38 UTC
Permalink
Hola Carlos,

On 11 Apr 2007 14:35:53 -0700, "Carlos M. Calvelo"
Post by Carlos M. Calvelo
Post by Octavio Hernandez
Por eso por ejemplo en .NET definieron el
operador == de manera
distinta, para q fuera posible decir if (s1 == s2) en vez de if
(s1.equals(s2)) como hay que hacer
en Java. Aunque admito que eso podría no gustarle a muchos, por las razones
q se han comentado
antes en este hilo.
Claro, el significado del == depende entonces de los tipos/clases
y eso embrolla el lenguaje. Determinar la igualdad de valores
en distintas variables es un concepto muy básico en programación
y debería ser consistente.
Si, yo creo que esto empeora el lenguaje con respecto a Java por que
lo hace menos consistente y más complicado.

El "string" de C# es una mezcla extraña de tipo valor y tipo
referencia.
Post by Carlos M. Calvelo
Bueno, yo me imagino un lenguaje donde solo haya un 'tipo' de
tipos, valga la redundancia; que se comporten de manera uniforme.
Los problemas de rendimiento no deberían ser solucionados en el
diseño de un lenguaje sino en la implementación para quitar de
en medio esta carga administrativa a los programadores.
Por ejemplo en C# no tendría porque haber una diferenciación
entre tipos primitivos y clases en el lenguaje. Sí podría
la implementación (compilador) 'ser consciente' de algunos tipos
y sus operaciones y optimizar; lo que se le impone ahora al
programador al tener que aprender un lenguaje más complicado.
El programador no tendría por qué ser consciente de ello.
Completamente de acuerdo.
Post by Carlos M. Calvelo
Mejor aun, me imagino un sistema de tipos común y externo a
todos los componentes que puedan formar parte de un sistema.
Así si yo digo por ejemplo en una base de datos que Nombre
es un String no tengo por que volver a decirlo en las
aplicaciones que usan ese dato;
Bueno, con LINQ nos acercamos un poco más a esto.

Ya puestos a pedir, a mi también me gustaría que si renombro una tabla
de la base de datos el cambio se propagase a todas las aplicaciones
que la usan de forma automática, y que si borro una tabla las
aplicaciones dejen de compilar hasta que no haga los cambios
pertinentes.
Post by Carlos M. Calvelo
Tampoco es que Java haya inventado todo esto. En realidad no hay
nada nuevo en Java. Lo más positivo, creo yo, es que ha popularizado
(por fin!) la recolección automática, de la que ya había otras
implementaciones ya hacía muchos años.
Lo que parece triste es que una idea ya lleva ahí *casi 50 años!*;
de repente aparecen implementaciones por todos los lados solo porque
unos imitan a otros y no porque estaban muy preocupados con el
hecho de que los programadores llevan años y años gestionando
memoria 'a mano'.
Esto de la recolección automática es una cosa que si la pruebas ya no
puedes vivir sin ella :-)


Saludos
Alfredo
principiante
2007-04-12 12:16:18 UTC
Permalink
Post by Alfredo Novoa
que la usan de forma automática, y que si borro una tabla las
aplicaciones dejen de compilar hasta que no haga los cambios
pertinentes.
Eso está mal redactado. Debiste decir: "hasta que haga los..." en vez de
"hasta que no haga los...". O en su defecto: "mientras no haga los...".

Hay que usar bien el castellano, no? ;-)

José TH
Carlos
2007-04-13 02:06:08 UTC
Permalink
Ufff... tanto que vive el geniecillo Novoa corrigiendo el idioma a los
demas.

Esta estoy seguro que no te la responde para no admitir su error, cual
tipico mediocre.

Que payaso es ese Alfredito!! X-DDD
Post by principiante
Post by Alfredo Novoa
que la usan de forma automática, y que si borro una tabla las
aplicaciones dejen de compilar hasta que no haga los cambios
pertinentes.
Eso está mal redactado. Debiste decir: "hasta que haga los..." en vez de
"hasta que no haga los...". O en su defecto: "mientras no haga los...".
Hay que usar bien el castellano, no? ;-)
José TH
Octavio Hernandez
2007-04-12 10:47:29 UTC
Permalink
Hola, Carlos!
Post by Carlos M. Calvelo
Para mi lo mejor sería tener solo un tipo String.
Sí, eso suena totalmente razonable...
Post by Carlos M. Calvelo
Claro, el significado del == depende entonces de los tipos/clases
y eso embrolla el lenguaje. Determinar la igualdad de valores
en distintas variables es un concepto muy básico en programación
y debería ser consistente.

También tiene toda la lógica del mundo lo que dices, pero por otra
parte... ¿no os "repateaba" tener que escribir

if (s2.equals(s1)) ...

para comparar dos cadenas en Java? A mí sí...

Y lo q es peor, q sin darte cuenta puedes decir

if (s2 == s1)

y estarías comparando las referencias cuando lo que querías era
comparar los valores... Claro, el compilador podría dar una advertencia,
etc.

Saludos - Octavio
Carlos M. Calvelo
2007-04-12 21:27:25 UTC
Permalink
Hola Octavio,
Post by Octavio Hernandez
Hola, Carlos!
Post by Carlos M. Calvelo
Para mi lo mejor sería tener solo un tipo String.
Sí, eso suena totalmente razonable...
Post by Carlos M. Calvelo
Claro, el significado del == depende entonces de los tipos/clases
y eso embrolla el lenguaje. Determinar la igualdad de valores
en distintas variables es un concepto muy básico en programación
y debería ser consistente.
También tiene toda la lógica del mundo lo que dices, pero por otra
parte... ¿no os "repateaba" tener que escribir
if (s2.equals(s1)) ...
para comparar dos cadenas en Java? A mí sí...
Si, sobre todo con cadenas, que se suelen percibir como un
tipo primitivo.
Otra opción hubiera sido operadores especiales para el equals()
y el clone() porque es solo un cuestión de sintaxis.
Post by Octavio Hernandez
Y lo q es peor, q sin darte cuenta puedes decir
if (s2 == s1)
y estarías comparando las referencias cuando lo que querías era
comparar los valores...
Ya! Te entiendo. Pero es que las referencias *son* los valores
de las variables s1 y s2! :-)
Me recuerda también al problema de comparar con = en vez de ==.

De todas formas sigue siendo necesario poder distinguir entre
'son a y b iguales?' y 'son a y b el mismo?', que no es lo
mismo :) Un problema general; no solo en Java y C#.

Saludos,
Carlos
Hernan
2007-04-13 09:29:31 UTC
Permalink
Post by Carlos M. Calvelo
Post by Octavio Hernandez
Post by Carlos M. Calvelo
Para mi lo mejor sería tener solo un tipo String.
Sí, eso suena totalmente razonable...
Post by Carlos M. Calvelo
Claro, el significado del == depende entonces de los tipos/clases
y eso embrolla el lenguaje. Determinar la igualdad de valores
en distintas variables es un concepto muy básico en programación
y debería ser consistente.
También tiene toda la lógica del mundo lo que dices, pero por otra
parte... ¿no os "repateaba" tener que escribir
if (s2.equals(s1)) ...
para comparar dos cadenas en Java? A mí sí...
Si, sobre todo con cadenas, que se suelen percibir como un
tipo primitivo.
Otra opción hubiera sido operadores especiales para el equals()
y el clone() porque es solo un cuestión de sintaxis.
Post by Octavio Hernandez
Y lo q es peor, q sin darte cuenta puedes decir
if (s2 == s1)
y estarías comparando las referencias cuando lo que querías era
comparar los valores...
Ya! Te entiendo. Pero es que las referencias *son* los valores
de las variables s1 y s2! :-)
Me recuerda también al problema de comparar con = en vez de ==.
De todas formas sigue siendo necesario poder distinguir entre
'son a y b iguales?' y 'son a y b el mismo?', que no es lo
mismo :) Un problema general; no solo en Java y C#.
Hombre... Problema, no es. Solo hay que tener claro la
diferencia conceptual y saber cuáles son los operadores,
palabras claves y/o métodos que se utilizan en ambos
casos en un lenguaje particular.

-H.
Alfredo Novoa
2007-04-13 10:54:22 UTC
Permalink
Post by Hernan
Hombre... Problema, no es. Solo hay que tener claro la
diferencia conceptual y saber cuáles son los operadores,
palabras claves y/o métodos que se utilizan en ambos
casos en un lenguaje particular.
Si te basas en la diferencia conceptual entonces pensarías que
(s1==s2) está comparando los punteros en lugar de las variables
apuntadas por los punteros.


Saludos
Hernan
2007-04-13 16:33:16 UTC
Permalink
Post by Alfredo Novoa
Post by Hernan
Hombre... Problema, no es. Solo hay que tener claro la
diferencia conceptual y saber cuáles son los operadores,
palabras claves y/o métodos que se utilizan en ambos
casos en un lenguaje particular.
Si te basas en la diferencia conceptual entonces pensarías que
(s1==s2) está comparando los punteros en lugar de las variables
apuntadas por los punteros.
¿Por qué habría de pensar eso? Mi comentario se refería a
al supuesto problema entre distinguir entre igualdad e
identidad en cualquier lenguaje de programación.
Post by Alfredo Novoa
De todas formas sigue siendo necesario poder distinguir entre
'son a y b iguales?' y 'son a y b el mismo?', que no es lo
mismo :) Un problema general; no solo en Java y C#.
Volviendo a C# y a los strings, aquí el operador ==
está sobrecargado y su implementación está basada en
el método .Equals(). No hay misterios aquí.

De existir algún problema (de verdad que no lo veo) en el
específico caso de la comparación entre cadenas, podría deberse
a que se suele pasar por alto que C# permite sobrecarga de
operadores. Muchos programadores ven un signo "+" e
inmediatamente piensan en sumas. :(

-H.
principiante
2007-04-13 21:54:42 UTC
Permalink
Post by Hernan
operadores. Muchos programadores ven un signo "+" e
nmediatamente piensan en sumas. :(
Yo por ejemplo. Nunca he entendido porque se pone "+=" para asignar un
manejador a un evento, si tambien se usa para suma aritmetica :(


Jose TH
Hernan
2007-04-15 20:47:06 UTC
Permalink
Post by principiante
Post by Hernan
operadores. Muchos programadores ven un signo "+" e
nmediatamente piensan en sumas. :(
Yo por ejemplo. Nunca he entendido porque se pone "+=" para asignar un
manejador a un evento, si tambien se usa para suma aritmetica :(
La sobrecarga de operadores es razonable para tipos matemáticos:
números complejos, matrices, etc. En otros tipos de datos se torna
muy arbitrario.

-H.
Octavio Hernandez
2007-04-15 22:09:51 UTC
Permalink
Hola,

Pienso que es porque los manejadores de eventos en .NET son de
multi-difusión (multicast), y lo que estás haciendo al escribir

btn1.MouseClick += delegate { ... }

es añadir (agregar) un delegado más al conjunto de delegados a
invocar cuando se produzca el evento.

Slds - Octavio
Post by principiante
Post by Hernan
operadores. Muchos programadores ven un signo "+" e
nmediatamente piensan en sumas. :(
Yo por ejemplo. Nunca he entendido porque se pone "+=" para asignar un
manejador a un evento, si tambien se usa para suma aritmetica :(
Jose TH
Carlos M. Calvelo
2007-04-14 00:24:27 UTC
Permalink
Post by Hernan
Volviendo a C# y a los strings, aquí el operador ==
está sobrecargado y su implementación está basada en
el método .Equals(). No hay misterios aquí.
De existir algún problema (de verdad que no lo veo) en el
específico caso de la comparación entre cadenas, podría deberse
a que se suele pasar por alto que C# permite sobrecarga de
operadores. Muchos programadores ven un signo "+" e
inmediatamente piensan en sumas. :(
Hernan,

Como mi elocuencia deja mucho que desear:

"Programs must be written for people to read, and only incidentally
for machines to execute."
Abelson & Sussman

Saludos,
Carlos
Alfredo Novoa
2007-04-15 22:48:11 UTC
Permalink
Hola Hernan,
Post by Hernan
Post by Alfredo Novoa
Si te basas en la diferencia conceptual entonces pensarías que
(s1==s2) está comparando los punteros en lugar de las variables
apuntadas por los punteros.
¿Por qué habría de pensar eso?
Pues por que los tipos por referencia funcionan así y "string" es un
tipo por referencia.
Post by Hernan
Volviendo a C# y a los strings, aquí el operador ==
está sobrecargado y su implementación está basada en
el método .Equals(). No hay misterios aquí.
Pero no es consistente.
Post by Hernan
De existir algún problema (de verdad que no lo veo) en el
específico caso de la comparación entre cadenas, podría deberse
a que se suele pasar por alto que C# permite sobrecarga de
operadores. Muchos programadores ven un signo "+" e
inmediatamente piensan en sumas. :(
Y piensan muy bien, el signo + es para las sumas.

Usar el signo + para concatenar cadenas es otro de los defectos de C#.


Saludos
Hernan
2007-04-17 19:32:36 UTC
Permalink
Post by Alfredo Novoa
Post by Hernan
Post by Alfredo Novoa
Si te basas en la diferencia conceptual entonces pensarías que
(s1==s2) está comparando los punteros en lugar de las variables
apuntadas por los punteros.
¿Por qué habría de pensar eso?
Pues por que los tipos por referencia funcionan así y "string" es un
tipo por referencia.
Vuelvo a repetir, la inconsistencia, problema o como querráis
llamarlo no está en los tipos de datos (si son por referencia o
valor.)
Otra cosa completamente diferente es la sobrecarga del operador
de comparación.
Post by Alfredo Novoa
Post by Hernan
Volviendo a C# y a los strings, aquí el operador ==
está sobrecargado y su implementación está basada en
el método .Equals(). No hay misterios aquí.
Pero no es consistente.
Ah. En esto te puedo dar la razón. Pero así es como funcionan
los strings y eso es algo el C# NO va a cambiar en los próximos,
digamos, 10 años.
Así que mejor que los programadores se vayan enterando...
Post by Alfredo Novoa
Post by Hernan
De existir algún problema (de verdad que no lo veo) en el
específico caso de la comparación entre cadenas, podría deberse
a que se suele pasar por alto que C# permite sobrecarga de
operadores. Muchos programadores ven un signo "+" e
inmediatamente piensan en sumas. :(
Y piensan muy bien, el signo + es para las sumas.
No. Piensan mal. Esto no es álgebra. Es programación en un
lenguaje determinado: C#.

Cuando te sientas frente al ordenador y abres el editor para programar
en un determinado lenguaje tienes que _pensar_ en ese lenguaje.
Podrás patalear cada vez que veas alguna trastada pero como dicen
aquí "ajo y agua".

(Aclaro con el "tu" no me referiero a específicamente a ti, Alfredo.)
Post by Alfredo Novoa
Usar el signo + para concatenar cadenas es otro de los defectos de C#.
Mala suerte. Eso tampoco va a cambiar.

-H.
Alfredo Novoa
2007-04-17 22:50:58 UTC
Permalink
Hola Hernán,
Post by Hernan
Cuando te sientas frente al ordenador y abres el editor para programar
en un determinado lenguaje tienes que _pensar_ en ese lenguaje.
Podrás patalear cada vez que veas alguna trastada pero como dicen
aquí "ajo y agua".
Pero te puedes buscar un lenguaje mejor diseñado.

O incluso crearlo. :)

A mi personalmente me interesa conocer todos los fallos de C# para no
repetirlos.


Saludos

Alfredo Novoa
2007-04-13 10:51:05 UTC
Permalink
Hola Carlos,

On 12 Apr 2007 14:27:25 -0700, "Carlos M. Calvelo"
Post by Carlos M. Calvelo
Si, sobre todo con cadenas, que se suelen percibir como un
tipo primitivo.
Otra opción hubiera sido operadores especiales para el equals()
y el clone() porque es solo un cuestión de sintaxis.
Con el viejo Pascal creo recordar que se hacía algo así:

if s1 = s2 then { comparación de variables de tipo puntero }

if s1^ = s2^ then { comparación de las variables apuntadas por los
punteros }

Bastante mejor que lo que hay ahora, creo yo.

Por supuesto que con las cadenas no se hacía así por que eran tipos
valor.


Saludos
Hernan
2007-04-12 11:56:13 UTC
Permalink
Post by Carlos M. Calvelo
Bueno, yo me imagino un lenguaje donde solo haya un 'tipo' de
tipos, valga la redundancia; que se comporten de manera uniforme.
Los problemas de rendimiento no deberían ser solucionados en el
diseño de un lenguaje sino en la implementación para quitar de
en medio esta carga administrativa a los programadores.
Por ejemplo en C# no tendría porque haber una diferenciación
entre tipos primitivos y clases en el lenguaje. Sí podría
la implementación (compilador) 'ser consciente' de algunos tipos
y sus operaciones y optimizar; lo que se le impone ahora al
programador al tener que aprender un lenguaje más complicado.
El programador no tendría por qué ser consciente de ello.
No estás pidiendo nada nuevo. No solo hay lenguajes que no
hacen diferencias entre tipos de datos escalares (o simples) y
compuestos, también están aquellos dónde los nombres no tienen
que estar asociados a un tipo. Pero una implementación eficiente
no es sencilla.

Todo el mundo está de acuerdo que cuanto menos tenga que
escribir el programador, mejor. Desgraciadamente, todavía estamos
en pañales. Por suerte, esto es ciencia, y seguramente en los
próximos años veremos muchísimas mejoras especialmente
dado los avances en inferencia de tipos.

En el caso de C#-CLI hubo decisiones que evidentemente se han
tomado buscando la mejor conveniencia para acortar distancias
respecto a Java-JVM (que le llevaba 10 años)
Post by Carlos M. Calvelo
Mejor aun, me imagino un sistema de tipos común y externo a
todos los componentes que puedan formar parte de un sistema.
Así si yo digo por ejemplo en una base de datos que Nombre
es un String no tengo por que volver a decirlo en las
aplicaciones que usan ese dato; y si lo tengo que decir,
por lo menos que sea el mismo tipo String.
Lo que es un String estaría definido fuera del lenguaje
de programación, fuera del sgbd y fuera de cualquier otro
componente que pueda formar parte del sistema. Esto sería
especialmente importante para todos aquellos datos que pasan
de unos componentes a otros por medio de alguna interfaz.
Bueno.. basta de visiones de futuro :)
Post by Octavio Hernandez
http://www.ifi.unizh.ch/richter/Classes/oose2/01_Collections/03_small...
Y en los lenguajes de Hejlsberg, ya desde Delphi 2 (1996, cuando Java era
aún "de juguete")
se añadieron las cadenas por referencia con recolección automática...
Tampoco es que Java haya inventado todo esto. En realidad no hay
nada nuevo en Java. Lo más positivo, creo yo, es que ha popularizado
(por fin!) la recolección automática, de la que ya había otras
implementaciones ya hacía muchos años.
Lo que parece triste es que una idea ya lleva ahí *casi 50 años!*;
de repente aparecen implementaciones por todos los lados solo porque
unos imitan a otros y no porque estaban muy preocupados con el
hecho de que los programadores llevan años y años gestionando
memoria 'a mano'.
Opino distinto. No creo que sea un tema de moda o de imitaciones.
Las necesidades son diferentes hoy día. No se programa igual que
antes,
no se usan los mismos paradigmas, la relación de costes entre
hardware y software no es igual que hace 30 años ni la demanda de
productividad tampoco es la misma (hace 20 años era normal que los
proyectos se midieran en años/hombre y hoy día la gran mayoría
apenas duran unos pocos meses.)

-H.
Alfredo Novoa
2007-04-12 14:17:19 UTC
Permalink
Post by Hernan
No estás pidiendo nada nuevo. No solo hay lenguajes que no
hacen diferencias entre tipos de datos escalares (o simples) y
compuestos, también están aquellos dónde los nombres no tienen
que estar asociados a un tipo.
Los únicos tipos no escalares que tiene C# 2.0 son los "array", y
además los trata de una forma bastante extraña.
Post by Hernan
Todo el mundo está de acuerdo que cuanto menos tenga que
escribir el programador, mejor.
No creas, hay muchos programadores que no están dispuestos a aceptar
un nuevo paradigma ni cualquier cambio importante.

Piensa en cuantos se han quedado por el camino cuando se pasó de
MS-DOS a Windows, o en lo que han tardado otros en pasar de los .DBF,
.MDB y similares a los SGBD SQL.
Post by Hernan
Opino distinto. No creo que sea un tema de moda o de imitaciones.
Las necesidades son diferentes hoy día.
Yo creo que las necesidades no han cambiado casi nada y que
desgraciadamente la industria de la informática se mueve a base de
modas por que hay muy poca gente capacitada para reconocer el valor de
cada tecnología, y la mayoría siguen ciegamente al rebaño y toman las
decisiones basandose en consignas o razonamientos superficiales.
Post by Hernan
No se programa igual que
antes,
no se usan los mismos paradigmas
Se usan los mismos que hace 40 años: procedimental, declarativo,
imperativo, funcional, lógico y poco más.
Post by Hernan
, la relación de costes entre
hardware y software no es igual que hace 30 años ni la demanda de
productividad tampoco es la misma (hace 20 años era normal que los
proyectos se midieran en años/hombre y hoy día la gran mayoría
apenas duran unos pocos meses.)
Eso tiene mucho más que ver con el tamaño de los proyectos que con la
productividad. La productividad no ha mejorado mucho en los últimos 20
años con la excepción de que ahora se usa mucho más SQL, que si que es
mucho más productivo que los métodos anteriores. La diferencia de
productividad entre C y C++ es bastante pequeña.



Saludos
Alfredo
Alfredo Novoa
2007-04-10 16:26:10 UTC
Permalink
On Tue, 10 Apr 2007 15:53:45 +0200, "Alberto Poblacion"
Post by Alberto Poblacion
Post by Alfredo Novoa
Primero "instanciar" e "instanciado" no existen en español, y no está
Cierto, en el diccionario de la RAE no está, pero la pregunta original
era "Saber si un objeto esta instanciado". Responder a la pregunta
simplemente diciendo que esa palabra no existe es bastante poco útil para el
que realiza la pregunta.
Si lo es por que así puede volver a preguntar algo con sentido.
Post by Alberto Poblacion
Y ya puestos a contestarla, ¿por qué no usar en la
respuesta el mismo término que utilizó el autor original, aunque sea un
barbarismo derivado del inglés "instance"?
Pues por que es un barbarismo y por que es dificil saber que es lo que
puede querer decir.

Si lo traducimos del "espanglis" al español sería: ¿Está el objeto
ejemplarizado?

¿Y eso que rayos quiere decir?
Post by Alberto Poblacion
Post by Alfredo Novoa
Y segundo, no hay ningún estandar sobre lo que significa objeto, así
string s = null;
"s" es un objeto no inicializado. Que creo que es a lo que se refiere
Justo, "s" es lo que en mi explicación yo he llamado "una referencia a
un objeto", y efectivamente le decía que si así es como lo tiene, podía
compararlo con null.
Ya, pero ¿Por qué no usar en la respuesta el mismo significado que
utilizó el autor de la pregunta? :-)

Una razón sería por que es igual de confusa y arbitraria una forma que
la otra.
Post by Alberto Poblacion
"Pepe" sigue en memoria, y se puede alcanzar a través de la
referencia "t", a pesar de que s vale null. Si a "s" y "t" les llamamos
objetos, igual que a "Pepe", se vuelve muy complejo expresar a qué nos
estams refiriendo realmente cuando hablamos de estas cosas.
Si, y además también podemos llamar objeto a la pareja variable
referencia y variable del montón, y también a la pareja valor
referencia y valor de la variable del montón.
Post by Alberto Poblacion
No tengo
inconveniente en llamarles objetos si lo crees oportuno, pero pienso que
resulta más práctico hacer la distinción entre referencias y objetos.
Si usamos los términos clásicos resulta mucho más sencillo y no hay
lugar para la confusión.

Vamos, que yo creo que lo mejor sería no usar nunca la palabra
"objeto" por que es un comodín que puede significar cualquier cosa.



Saludos
Daniel A. Calvin
2007-04-11 01:30:02 UTC
Permalink
Hola Pedro

( escribi bastante, si no te gusta la primer opcion, mira la segunda )
La primera se usa:

Form Form1 = new Form1();
if (ExisteInstanciaMiObjetoEn(Form1))
Console.WriteLine("Form1 tiene asiganda la instancia de
algun objeto en MiObjeto, Si!!!!!");
else
if (ExisteMiObjetoEn(Form1))

( pero requiere que implementes interfaces )

La segunda no requiere ninguna interface y se usa:

Form1 f=new Form1();
object o = GetObjetoDesde(f, "MiObjeto");
( luego pregunta si o es null o no..... )

Va la explicación......


Veo que el tema se ha puesto pesado, muchas respuestas....

Tenes dos formas de hacer esto, una sería confiando en los tipos, la otra
por reflection, tal como menciono alguien.

Hay factores determinantes para utilizar una u otra, a mi me gusta mas la
primera y te digo como la implementaria.

Paso uno:

Defino una interface que contemple el objeto que te interesa, algo asi:

interface IXxxx
{
object MiObjeto { get; set; }
}

En los formulario que deban tener la propiedad MiObjeto hago:

public partial class Form1 : Form, IXxxx

Form1 implementa la interface IXxxx

Luego escribo donde yo quiera la funcion que averigua si existe la MiObjeto:

bool ExisteMiObjeto(object o)
{
return((o as IXxxx) != null);
}

Ahora escribo otra que me dice si existe una instancia asignada a MiPropiedad

bool ExisteInstanciaMiObjetoEn(object o)
{
if (ExisteMiObjetoEn(o))
if ((o as IXxxx).MiObjeto != null)
return true;
return false;
}

Como se usa esto?

Un ejemplo:
Form Form1 = new Form1();
if (ExisteInstanciaMiObjetoEn(Form1))
Console.WriteLine("Form1 tiene asiganda la instancia de
algun objeto en MiObjeto, Si!!!!!");
else
if (ExisteMiObjetoEn(Form1))
{
Console.WriteLine("Existe una referencia llamada mi
Objeto, pero no tiene asignada ninguna instancia !!!!");
}
else
{
Console.WriteLine("Form1 no tiene una propiedad llamada
MiObjeto");
}

Esto me parece lo mas seguro, ya que se puede chequear tipos en tiempo e
ejecución.



Si esto no es lo que queres y necesitas que se resuelva en tiempod e
ejecución podes hacer esto otro, este no reuiqere que declares ninguna
interface , ni nada, de hcho te sirve para cualquier objeto, no solo un
formulario.

Debes arriba hacer:

Using System.Reflection;

En algun lugar escribir este metodo:

static bool ExisteVariableEn(Form contenedor, string miObjeto)
{
Type t = contenedor.GetType();

try
{
PropertyInfo pi = t.GetProperty(miObjeto);
return true;
}
catch (Exception ep)
{
try
{
FieldInfo fi = t.GetField(miObjeto);
return true;
}
catch(Exception ef)
{
return false;
}

}


}

Le pasaras como parametros el formulario, no una cadena con su nombre, el
objeto) y el nombre de la propiedad o campo. ( eso si sera una string )

Ejemplo de uso:

Form1 f=new Form1();
bool b=ExisteVariableEn( f,"MiObjeto");

De esta forma vas a saber si existe una variable con el nombre que te
interesa.
Ahora si quieres saber si referencia a algun objeto escribi otro metodo:


static object GetObjetoDesde(object contenedor, string miObjeto)
{
Type t = contenedor.GetType();

try
{
PropertyInfo pi = t.GetProperty(miObjeto);
return pi.GetValue(contenedor,null);
}
catch (Exception ep)
{
try
{
FieldInfo fi = t.GetField(miObjeto);
return fi.GetValue(contenedor);
}
catch (Exception ef)
{
return null;
}

}
}

Ejemplo de uso:

Form1 f=new Form1();
object o = GetObjetoDesde(f, "MiObjeto");


Espero te gusten, me llevo un ratito armarlo....
--
Daniel A. Calvin
MCP
Post by Pedro
Como saber si un objeto de determinado tipo (clase) se encuentra
instanciado?
Ej. public static bool ExisteObjeto(string cRutaObjeto)
//Ejemplo: bool ExisteMiobjeto=ExisteObjeto("Form1.MiObjeto")
Pedro
Pedro
2007-04-11 01:48:37 UTC
Permalink
Wao... pocas veces se ve una explicación tan profesional y detallada. No
sólo captaste hábilmente el concepto de lo que yo buscaba sino que diste
varias soluciones.

Te estoy muy agradecido por la ayuda.

Muchos saludos.

Pedro
Post by Daniel A. Calvin
Hola Pedro
( escribi bastante, si no te gusta la primer opcion, mira la segunda )
Form Form1 = new Form1();
if (ExisteInstanciaMiObjetoEn(Form1))
Console.WriteLine("Form1 tiene asiganda la instancia de
algun objeto en MiObjeto, Si!!!!!");
else
if (ExisteMiObjetoEn(Form1))
( pero requiere que implementes interfaces )
Form1 f=new Form1();
object o = GetObjetoDesde(f, "MiObjeto");
( luego pregunta si o es null o no..... )
Va la explicación......
Veo que el tema se ha puesto pesado, muchas respuestas....
Tenes dos formas de hacer esto, una sería confiando en los tipos, la otra
por reflection, tal como menciono alguien.
Hay factores determinantes para utilizar una u otra, a mi me gusta mas la
primera y te digo como la implementaria.
interface IXxxx
{
object MiObjeto { get; set; }
}
public partial class Form1 : Form, IXxxx
Form1 implementa la interface IXxxx
bool ExisteMiObjeto(object o)
{
return((o as IXxxx) != null);
}
Ahora escribo otra que me dice si existe una instancia asignada a MiPropiedad
bool ExisteInstanciaMiObjetoEn(object o)
{
if (ExisteMiObjetoEn(o))
if ((o as IXxxx).MiObjeto != null)
return true;
return false;
}
Como se usa esto?
Form Form1 = new Form1();
if (ExisteInstanciaMiObjetoEn(Form1))
Console.WriteLine("Form1 tiene asiganda la instancia de
algun objeto en MiObjeto, Si!!!!!");
else
if (ExisteMiObjetoEn(Form1))
{
Console.WriteLine("Existe una referencia llamada mi
Objeto, pero no tiene asignada ninguna instancia !!!!");
}
else
{
Console.WriteLine("Form1 no tiene una propiedad llamada
MiObjeto");
}
Esto me parece lo mas seguro, ya que se puede chequear tipos en tiempo e
ejecución.
Si esto no es lo que queres y necesitas que se resuelva en tiempod e
ejecución podes hacer esto otro, este no reuiqere que declares ninguna
interface , ni nada, de hcho te sirve para cualquier objeto, no solo un
formulario.
Using System.Reflection;
static bool ExisteVariableEn(Form contenedor, string miObjeto)
{
Type t = contenedor.GetType();
try
{
PropertyInfo pi = t.GetProperty(miObjeto);
return true;
}
catch (Exception ep)
{
try
{
FieldInfo fi = t.GetField(miObjeto);
return true;
}
catch(Exception ef)
{
return false;
}
}
}
Le pasaras como parametros el formulario, no una cadena con su nombre, el
objeto) y el nombre de la propiedad o campo. ( eso si sera una string )
Form1 f=new Form1();
bool b=ExisteVariableEn( f,"MiObjeto");
De esta forma vas a saber si existe una variable con el nombre que te
interesa.
static object GetObjetoDesde(object contenedor, string miObjeto)
{
Type t = contenedor.GetType();
try
{
PropertyInfo pi = t.GetProperty(miObjeto);
return pi.GetValue(contenedor,null);
}
catch (Exception ep)
{
try
{
FieldInfo fi = t.GetField(miObjeto);
return fi.GetValue(contenedor);
}
catch (Exception ef)
{
return null;
}
}
}
Form1 f=new Form1();
object o = GetObjetoDesde(f, "MiObjeto");
Espero te gusten, me llevo un ratito armarlo....
--
Daniel A. Calvin
MCP
Post by Pedro
Como saber si un objeto de determinado tipo (clase) se encuentra
instanciado?
Ej. public static bool ExisteObjeto(string cRutaObjeto)
//Ejemplo: bool ExisteMiobjeto=ExisteObjeto("Form1.MiObjeto")
Pedro
Rafael
2007-04-12 01:18:42 UTC
Permalink
Eso demuestra que en C# se puede hacer muchas mas cosas de lo que uno cree.
Solo es cuestion de irlas sabiendo poco a poco.
Hay que decir que la documentacion de Visual Studio no ayuda mucho para uno
"descubrir" como hacer ese tipo de cosas.
Post by Pedro
Wao... pocas veces se ve una explicación tan profesional y detallada. No
sólo captaste hábilmente el concepto de lo que yo buscaba sino que diste
varias soluciones.
Te estoy muy agradecido por la ayuda.
Muchos saludos.
Pedro
Post by Daniel A. Calvin
Hola Pedro
( escribi bastante, si no te gusta la primer opcion, mira la segunda )
Form Form1 = new Form1();
if (ExisteInstanciaMiObjetoEn(Form1))
Console.WriteLine("Form1 tiene asiganda la instancia de
algun objeto en MiObjeto, Si!!!!!");
else
if (ExisteMiObjetoEn(Form1))
( pero requiere que implementes interfaces )
Form1 f=new Form1();
object o = GetObjetoDesde(f, "MiObjeto");
( luego pregunta si o es null o no..... )
Va la explicación......
Veo que el tema se ha puesto pesado, muchas respuestas....
Tenes dos formas de hacer esto, una sería confiando en los tipos, la otra
por reflection, tal como menciono alguien.
Hay factores determinantes para utilizar una u otra, a mi me gusta mas la
primera y te digo como la implementaria.
interface IXxxx
{
object MiObjeto { get; set; }
}
public partial class Form1 : Form, IXxxx
Form1 implementa la interface IXxxx
bool ExisteMiObjeto(object o)
{
return((o as IXxxx) != null);
}
Ahora escribo otra que me dice si existe una instancia asignada a MiPropiedad
bool ExisteInstanciaMiObjetoEn(object o)
{
if (ExisteMiObjetoEn(o))
if ((o as IXxxx).MiObjeto != null)
return true;
return false;
}
Como se usa esto?
Form Form1 = new Form1();
if (ExisteInstanciaMiObjetoEn(Form1))
Console.WriteLine("Form1 tiene asiganda la instancia de
algun objeto en MiObjeto, Si!!!!!");
else
if (ExisteMiObjetoEn(Form1))
{
Console.WriteLine("Existe una referencia llamada mi
Objeto, pero no tiene asignada ninguna instancia !!!!");
}
else
{
Console.WriteLine("Form1 no tiene una propiedad llamada
MiObjeto");
}
Esto me parece lo mas seguro, ya que se puede chequear tipos en tiempo e
ejecución.
Si esto no es lo que queres y necesitas que se resuelva en tiempod e
ejecución podes hacer esto otro, este no reuiqere que declares ninguna
interface , ni nada, de hcho te sirve para cualquier objeto, no solo un
formulario.
Using System.Reflection;
static bool ExisteVariableEn(Form contenedor, string miObjeto)
{
Type t = contenedor.GetType();
try
{
PropertyInfo pi = t.GetProperty(miObjeto);
return true;
}
catch (Exception ep)
{
try
{
FieldInfo fi = t.GetField(miObjeto);
return true;
}
catch(Exception ef)
{
return false;
}
}
}
Le pasaras como parametros el formulario, no una cadena con su nombre, el
objeto) y el nombre de la propiedad o campo. ( eso si sera una string )
Form1 f=new Form1();
bool b=ExisteVariableEn( f,"MiObjeto");
De esta forma vas a saber si existe una variable con el nombre que te
interesa.
static object GetObjetoDesde(object contenedor, string miObjeto)
{
Type t = contenedor.GetType();
try
{
PropertyInfo pi = t.GetProperty(miObjeto);
return pi.GetValue(contenedor,null);
}
catch (Exception ep)
{
try
{
FieldInfo fi = t.GetField(miObjeto);
return fi.GetValue(contenedor);
}
catch (Exception ef)
{
return null;
}
}
}
Form1 f=new Form1();
object o = GetObjetoDesde(f, "MiObjeto");
Espero te gusten, me llevo un ratito armarlo....
--
Daniel A. Calvin
MCP
Post by Pedro
Como saber si un objeto de determinado tipo (clase) se encuentra
instanciado?
Ej. public static bool ExisteObjeto(string cRutaObjeto)
//Ejemplo: bool ExisteMiobjeto=ExisteObjeto("Form1.MiObjeto")
Pedro
Daniel A. Calvin
2007-04-12 13:00:03 UTC
Permalink
Hola Rafael

Una opinión personal sobre el tema,

net framework es muy grande, fijate que ya no hablo de c# ( en net el
lenguaje es anecdotico, el ejemplo que mande se puede escribir en vb.net, c#
o lo que gustes ).

Para desarrollar en net, lo mismo en otras plataformas, java por ejemplo,
hay que manejar muchos conceptos.

1 - Plataforma ( net framework en nuestro caso, JDK en el de java )
2 - Conceptos de OOP
3 - Principios de diseño
4 - Patrones GoF, GRASP
5 - Arquitectura

Seguramente se me escape algún punto, no es importante, lo que quiero
significar es que desarrollar en net implica un conocimiento mas completo que
otras tecnologías o simplemente lenguajes.

Esto es lo que contribuye, a mi entender, a que la documentación muchas
veces no refleje nuestras necesidades, es dificil encontrar howto's que
respondan a cuestiones que vinculan muchos temas conceptuales.

Te puedo asegurar que el msdn comparado con la documentación oficial de sun
para el sdk de java es un lujo.

Hay mucha ínfo en la doc de vs, en el msdn completo, solo pasa que muchas
veces no es fácil buscar o saber bajo que terminos hacerlo.

net framework tiene su curva de aprendizaje, hay que tener paciencia y si es
posible leer mucho sobre OOP ( entendiendo por esto casi todos los items
enumerados antes ), solo hay que armarse de paciencia.

Un abrazo desde aqui

Daniel A. Calvin
MCP
Post by Rafael
Eso demuestra que en C# se puede hacer muchas mas cosas de lo que uno cree.
Solo es cuestion de irlas sabiendo poco a poco.
Hay que decir que la documentacion de Visual Studio no ayuda mucho para uno
"descubrir" como hacer ese tipo de cosas.
Post by Pedro
Wao... pocas veces se ve una explicación tan profesional y detallada. No
sólo captaste hábilmente el concepto de lo que yo buscaba sino que diste
varias soluciones.
Te estoy muy agradecido por la ayuda.
Muchos saludos.
Pedro
Post by Daniel A. Calvin
Hola Pedro
( escribi bastante, si no te gusta la primer opcion, mira la segunda )
Form Form1 = new Form1();
if (ExisteInstanciaMiObjetoEn(Form1))
Console.WriteLine("Form1 tiene asiganda la instancia de
algun objeto en MiObjeto, Si!!!!!");
else
if (ExisteMiObjetoEn(Form1))
( pero requiere que implementes interfaces )
Form1 f=new Form1();
object o = GetObjetoDesde(f, "MiObjeto");
( luego pregunta si o es null o no..... )
Va la explicación......
Veo que el tema se ha puesto pesado, muchas respuestas....
Tenes dos formas de hacer esto, una sería confiando en los tipos, la otra
por reflection, tal como menciono alguien.
Hay factores determinantes para utilizar una u otra, a mi me gusta mas la
primera y te digo como la implementaria.
interface IXxxx
{
object MiObjeto { get; set; }
}
public partial class Form1 : Form, IXxxx
Form1 implementa la interface IXxxx
bool ExisteMiObjeto(object o)
{
return((o as IXxxx) != null);
}
Ahora escribo otra que me dice si existe una instancia asignada a MiPropiedad
bool ExisteInstanciaMiObjetoEn(object o)
{
if (ExisteMiObjetoEn(o))
if ((o as IXxxx).MiObjeto != null)
return true;
return false;
}
Como se usa esto?
Form Form1 = new Form1();
if (ExisteInstanciaMiObjetoEn(Form1))
Console.WriteLine("Form1 tiene asiganda la instancia de
algun objeto en MiObjeto, Si!!!!!");
else
if (ExisteMiObjetoEn(Form1))
{
Console.WriteLine("Existe una referencia llamada mi
Objeto, pero no tiene asignada ninguna instancia !!!!");
}
else
{
Console.WriteLine("Form1 no tiene una propiedad llamada
MiObjeto");
}
Esto me parece lo mas seguro, ya que se puede chequear tipos en tiempo e
ejecución.
Si esto no es lo que queres y necesitas que se resuelva en tiempod e
ejecución podes hacer esto otro, este no reuiqere que declares ninguna
interface , ni nada, de hcho te sirve para cualquier objeto, no solo un
formulario.
Using System.Reflection;
static bool ExisteVariableEn(Form contenedor, string miObjeto)
{
Type t = contenedor.GetType();
try
{
PropertyInfo pi = t.GetProperty(miObjeto);
return true;
}
catch (Exception ep)
{
try
{
FieldInfo fi = t.GetField(miObjeto);
return true;
}
catch(Exception ef)
{
return false;
}
}
}
Le pasaras como parametros el formulario, no una cadena con su nombre, el
objeto) y el nombre de la propiedad o campo. ( eso si sera una string )
Form1 f=new Form1();
bool b=ExisteVariableEn( f,"MiObjeto");
De esta forma vas a saber si existe una variable con el nombre que te
interesa.
static object GetObjetoDesde(object contenedor, string miObjeto)
{
Type t = contenedor.GetType();
try
{
PropertyInfo pi = t.GetProperty(miObjeto);
return pi.GetValue(contenedor,null);
}
catch (Exception ep)
{
try
{
FieldInfo fi = t.GetField(miObjeto);
return fi.GetValue(contenedor);
}
catch (Exception ef)
{
return null;
}
}
}
Form1 f=new Form1();
object o = GetObjetoDesde(f, "MiObjeto");
Espero te gusten, me llevo un ratito armarlo....
--
Daniel A. Calvin
MCP
Post by Pedro
Como saber si un objeto de determinado tipo (clase) se encuentra
instanciado?
Ej. public static bool ExisteObjeto(string cRutaObjeto)
//Ejemplo: bool ExisteMiobjeto=ExisteObjeto("Form1.MiObjeto")
Pedro
principiante
2007-04-12 13:44:07 UTC
Permalink
Post by Daniel A. Calvin
Te puedo asegurar que el msdn comparado con la documentación oficial de sun
para el sdk de java es un lujo.
Hay mucha ínfo en la doc de vs, en el msdn completo, solo pasa que muchas
veces no es fácil buscar o saber bajo que terminos hacerlo.
Yo voy a hablar por mi caso en cuanto a la documentación de VS, esa que
aparece cuando doy F1 en el IDE.

Me estoy iniciando en C# y tambien pienso igual que Rafael de que la
documentacion deja mucho que desear, yo (igual que otros que han preguntado
cosas parecidas) he querido tratar de encontrar sin exito cosas no obvias
como: Es mas eficiente usar Sqlclient que usar Common para sql server?,
Porque un datatable no aparece en el toolbox, es que no se deben usar
independientemente?, las propiedades dinamicas son modificables
programaticalmente?, como hacer aparecer un control de usuario en la
toolbox?, como pongo una propiedad de usuario en la ventana de propiedades?
como agrego tablas de una clase heredada a mi dataset visualmente?, le puedo
indicar a mi dataset heredado, cual es la clase de datatables a agregar?
que significa cada atributo, o mejor dicho, que son los atributos tal como
los trata .NET (me refiero a una definicion conceptual. Vamos no tengo por
que saber todo..)?, es mas eficiente un dataset tipado que uno no tipado?,
por que debo usar tableadapters?, puedo solo usar datatables para manejar
datos ignorando los datasets?, son realmente necesarios los datasets?,
..bindingsource y bindingcontext, cuando usar una u otra? puedo modificar
mis librerias de clases mientras las utilizo en mi proyecto windows
abierto?, por que el commandbuilder no me pone en el where de un
updatecommand solo la comparacion de la clave primaria sino que pone todos
los campos de la datatable? .. como hago para cambiar el comportamiento de
un bindingnavigator?... por que Dataset1.designer.cs genera mas de 1000
lineas de codigo si solo quiero manejar una tablita con dos columnas ...
etc... etc..etc... etc...

Finalmente las voy resolviendo poco a poco, si es posible y mi trabajo me lo
permite, pasando dias de busqueda e impresion en google, en colabora.net,
el guille y en foros importantes como este.
Quizas la informacion esta ahi en la documentacion pero sencillamente no es
facil de encontrar, como dices. Para los novatos nos resulta dedicar un
tiempo excesivo para dar los primeros pasos. Yo vengo de otros lenguajes y
plataformas y es la primera vez que me resulta tan complejo iniciarme en una
plataforma nueva tratando de basarme de inicio en su propia documentacion.
.NET no es nada simple. Los lenguajes despues de .NET volvieron a ser
dificiles.

Esa es mi opinion.

Saludos y te exhorto a que sigas participando y colaborando ya que no te veo
mucho por aquí.

José TH
Pedro
2007-04-14 23:03:51 UTC
Permalink
Comparto lo que dices sobre la documentacion y sobre que .NET es dificil.
Es porque es demasiado extenso y requiere mucho tiempo aprender siquiera lo
basico para programar un sistema.
MS penso que haciendo un software tan extenso era suficiente pero perdio un
poco de vista la especializacion y la facilidad de aprendizaje. Faltan
clases mas especializadas y de mayor nivel de abstraccion sobre todo para
tratar con datos.
Confunde mucho tambien tantas cosas diferentes para hacer cosas similares.

Funciones y rutinas que VFP, lenguaje de donde vengo, tenía incorporadas en
el lenguaje desde hace varios años, en .NET hay que volver a reprogramarlas
dando como resultado programas mas largos y sobrecargados.
Hasta T-SQL tiene funciones pre-hechas que ahorran codigo.

Cuando se esperaba que la tendencia fuese simplificar y facilitarle la vida
a los programadores MS ha retrocedido en ese sentido a .NET.
Post by principiante
Post by Daniel A. Calvin
Te puedo asegurar que el msdn comparado con la documentación oficial de sun
para el sdk de java es un lujo.
Hay mucha ínfo en la doc de vs, en el msdn completo, solo pasa que muchas
veces no es fácil buscar o saber bajo que terminos hacerlo.
Yo voy a hablar por mi caso en cuanto a la documentación de VS, esa que
aparece cuando doy F1 en el IDE.
Me estoy iniciando en C# y tambien pienso igual que Rafael de que la
documentacion deja mucho que desear, yo (igual que otros que han
preguntado cosas parecidas) he querido tratar de encontrar sin exito cosas
no obvias como: Es mas eficiente usar Sqlclient que usar Common para sql
server?, Porque un datatable no aparece en el toolbox, es que no se deben
usar independientemente?, las propiedades dinamicas son modificables
programaticalmente?, como hacer aparecer un control de usuario en la
toolbox?, como pongo una propiedad de usuario en la ventana de
propiedades? como agrego tablas de una clase heredada a mi dataset
visualmente?, le puedo indicar a mi dataset heredado, cual es la clase de
datatables a agregar? que significa cada atributo, o mejor dicho, que son
los atributos tal como los trata .NET (me refiero a una definicion
conceptual. Vamos no tengo por que saber todo..)?, es mas eficiente un
dataset tipado que uno no tipado?, por que debo usar tableadapters?, puedo
solo usar datatables para manejar datos ignorando los datasets?, son
realmente necesarios los datasets?, ..bindingsource y bindingcontext,
cuando usar una u otra? puedo modificar mis librerias de clases mientras
las utilizo en mi proyecto windows abierto?, por que el commandbuilder no
me pone en el where de un updatecommand solo la comparacion de la clave
primaria sino que pone todos los campos de la datatable? .. como hago para
cambiar el comportamiento de un bindingnavigator?... por que
Dataset1.designer.cs genera mas de 1000 lineas de codigo si solo quiero
manejar una tablita con dos columnas ... etc... etc..etc... etc...
Finalmente las voy resolviendo poco a poco, si es posible y mi trabajo me
lo permite, pasando dias de busqueda e impresion en google, en
colabora.net, el guille y en foros importantes como este.
Quizas la informacion esta ahi en la documentacion pero sencillamente no
es facil de encontrar, como dices. Para los novatos nos resulta dedicar un
tiempo excesivo para dar los primeros pasos. Yo vengo de otros lenguajes
y plataformas y es la primera vez que me resulta tan complejo iniciarme en
una plataforma nueva tratando de basarme de inicio en su propia
documentacion. .NET no es nada simple. Los lenguajes despues de .NET
volvieron a ser dificiles.
Esa es mi opinion.
Saludos y te exhorto a que sigas participando y colaborando ya que no te
veo mucho por aquí.
José TH
Daniel A. Calvin - Cooperator Team
2007-04-16 23:44:40 UTC
Permalink
Hola Gente

Primero quiero acalarar que lo mio fue un comentario, no fue mi intención
ofender y mucho menos menospreciar a alguien.
Fijate que la comparación fue con Java de sun.

Tengo 45 añitos, imaginate lo que me costo a mi tambien, a esta edad las
cosas hay que leerlas mas de 2, 3 o 4 veces para que se entiendan ... :))

Vengo de VB, he trabajado muy poco con VFox, pero se perfectamente la
potencia y facilidad de uso que ofrece.

Si hablamos de curva de aprendizaje, aprender net lleva su tiempo.
Si hablamos de facilidad de uso, depende la orientación de la cual venimos,
resulta mas simple o mas complejo.
Ej.
Si venis de Fox y estas acostumbardo a su magia, en tres linaeas abrir un
cursor, levantar un archivo de exto y generar una planilla excel, net será
un verdadero infierno.
Si venis de armar aplicacinones distribuisdas, ejecutando en transaction
server, com+ o servicos empresariales.... bueno, ahi tocaras el cielo con
las manos.
Si debes escribir servicios windows y antes debías hacerlo en c o c++, ni te
cuento la cara de felicidad.
Si venías de escribir aplicaciones web en asp 3.0 y vscript, en done nada
era tipado, en donde el control de errores era sumamente pobre, bla, bla,
bla, tambien estarás feliz.

Pero hay mucha info. La documentación del framework toca practicamente todos
los temas que mencionan, hay que leer mucho, saltearse poco y armarse de
paciencia.

Solo es una opinión personal, seguramente falten algunas cosas, pero hay
mucho disponible.

Un saludo
--
Daniel A. Calvin
Cooperator Team Member
http://www.cooperator.com.ar
Microsoft Certified Professional
Post by Pedro
Comparto lo que dices sobre la documentacion y sobre que .NET es dificil.
Es porque es demasiado extenso y requiere mucho tiempo aprender siquiera
lo basico para programar un sistema.
MS penso que haciendo un software tan extenso era suficiente pero perdio
un poco de vista la especializacion y la facilidad de aprendizaje. Faltan
clases mas especializadas y de mayor nivel de abstraccion sobre todo para
tratar con datos.
Confunde mucho tambien tantas cosas diferentes para hacer cosas similares.
Funciones y rutinas que VFP, lenguaje de donde vengo, tenía incorporadas
en el lenguaje desde hace varios años, en .NET hay que volver a
reprogramarlas dando como resultado programas mas largos y sobrecargados.
Hasta T-SQL tiene funciones pre-hechas que ahorran codigo.
Cuando se esperaba que la tendencia fuese simplificar y facilitarle la
vida a los programadores MS ha retrocedido en ese sentido a .NET.
Post by principiante
Post by Daniel A. Calvin
Te puedo asegurar que el msdn comparado con la documentación oficial de sun
para el sdk de java es un lujo.
Hay mucha ínfo en la doc de vs, en el msdn completo, solo pasa que muchas
veces no es fácil buscar o saber bajo que terminos hacerlo.
Yo voy a hablar por mi caso en cuanto a la documentación de VS, esa que
aparece cuando doy F1 en el IDE.
Me estoy iniciando en C# y tambien pienso igual que Rafael de que la
documentacion deja mucho que desear, yo (igual que otros que han
preguntado cosas parecidas) he querido tratar de encontrar sin exito
cosas no obvias como: Es mas eficiente usar Sqlclient que usar Common
para sql server?, Porque un datatable no aparece en el toolbox, es que no
se deben usar independientemente?, las propiedades dinamicas son
modificables programaticalmente?, como hacer aparecer un control de
usuario en la toolbox?, como pongo una propiedad de usuario en la
ventana de propiedades? como agrego tablas de una clase heredada a mi
dataset visualmente?, le puedo indicar a mi dataset heredado, cual es la
clase de datatables a agregar? que significa cada atributo, o mejor
dicho, que son los atributos tal como los trata .NET (me refiero a una
definicion conceptual. Vamos no tengo por que saber todo..)?, es mas
eficiente un dataset tipado que uno no tipado?, por que debo usar
tableadapters?, puedo solo usar datatables para manejar datos ignorando
los datasets?, son realmente necesarios los datasets?, ..bindingsource y
bindingcontext, cuando usar una u otra? puedo modificar mis librerias de
clases mientras las utilizo en mi proyecto windows abierto?, por que el
commandbuilder no me pone en el where de un updatecommand solo la
comparacion de la clave primaria sino que pone todos los campos de la
datatable? .. como hago para cambiar el comportamiento de un
bindingnavigator?... por que Dataset1.designer.cs genera mas de 1000
lineas de codigo si solo quiero manejar una tablita con dos columnas ...
etc... etc..etc... etc...
Finalmente las voy resolviendo poco a poco, si es posible y mi trabajo me
lo permite, pasando dias de busqueda e impresion en google, en
colabora.net, el guille y en foros importantes como este.
Quizas la informacion esta ahi en la documentacion pero sencillamente no
es facil de encontrar, como dices. Para los novatos nos resulta dedicar
un tiempo excesivo para dar los primeros pasos. Yo vengo de otros
lenguajes y plataformas y es la primera vez que me resulta tan complejo
iniciarme en una plataforma nueva tratando de basarme de inicio en su
propia documentacion. .NET no es nada simple. Los lenguajes despues de
.NET volvieron a ser dificiles.
Esa es mi opinion.
Saludos y te exhorto a que sigas participando y colaborando ya que no te
veo mucho por aquí.
José TH
Continúe leyendo en narkive:
Loading...