• Domingo 22 de Diciembre de 2024, 14:33

Autor Tema:  Referenciar Variables Sin Código Inseguro (unsafe)  (Leído 3629 veces)

Scherzo

  • Miembro activo
  • **
  • Mensajes: 64
    • Ver Perfil
    • http://www.mma-spain.com
Referenciar Variables Sin Código Inseguro (unsafe)
« en: Miércoles 29 de Agosto de 2007, 12:51 »
0
Hola, lo primero presentarme como nuevo usuario del foro. Soy programador de C# desde no hace mucho tiempo, por lo que todavía hay algunas cosas en las que estoy verde. Una de ellas es la que me ha llevado hasta vosotros (desde Google).

En el código que estoy haciendo me encuentro en la situación en la que tengo 5 variables (int) que son contadores. Cada vez que realizo una determinada acción con una tabla incremento el contador correspondiente. El problema es que el contador que he de incrementar viene determinado por la tabla en la que he hecho el proceso, lo que me lleva a realizar en múltiples partes del código consultas sobre la tabla en la que he actuado y así incrementar el contador correspondiente, es decir, algo así (en pseudocódigo):

Código: Text
  1. switch (tabla)
  2. {
  3.     case CENTROS :
  4.         intContadorCentros++;
  5.     case TIENDAS :
  6.         intContadorTiendas++;
  7.     case LOCALES :
  8.         intContadorLocales++;
  9. ...
  10. }
  11.  


Bien, no sé si me he sabido explicar. Entonces, lo que quisiera hacer es meter este switch en un único punto y tener una única variable contador que lo que haga sea apuntar al contador real que quiero incrementar, así podría simplemente incrementar este contador 'referencia' y automáticamente se incrementaría el contador real al que esté apuntando, sin necesidad de tener que estar comprobando antes a ver qué contador tengo que incrementar.

En resumen, que mi intContadorReferencia sea una especie de puntero al contador correspondiente.

El problema con el que me encuentro es que C# parece que sólo admite punteros si es mediante código inseguro. La duda que tengo es ¿no hay forma de hacer algo como lo que necesito sin necesidad de tener que meter código inseguro?

Espero no haber sido demasiado brasas para ser el primer mensaje, pero es que no consigo encontrar info por Google y ya no sé si es que no se puede hacer o es que soy demasiado torpe.

Un saludo y muchas gracias por vuestro tiempo/ayuda.


PD: sé que esto se podría hacer mediante una función a la que llame cada vez que necesite incrementar un contador, pero si se puede hacer en plan punteros, lo preferiría, aunque si no queda más remedio, pues lo haría con una función.

Neopro

  • Miembro MUY activo
  • ***
  • Mensajes: 316
    • Ver Perfil
Re: Referenciar Variables Sin Código Inseguro (unsafe)
« Respuesta #1 en: Miércoles 29 de Agosto de 2007, 16:14 »
0
Veo que utilizas Visual Studio 2005, la opcion para poder admitir eso es :

1.-  Permite las llamadas a codigo menos seguro, utilizadas en VS.NET 2003
En el Form1:
Código: Text
  1.            
  2.             CheckForIllegalCrossThreadCalls = false;
  3.  


No se si entendí bien, pero la otra opcion es la siguiente :
2.- Permite la llamada a codigo no seguro (que es lo que creo que necesitas)

Habilitar la opcion en Proyecto->Propiedades de (... nombre del software)

Pestaña Generar Luego Marcar Permitir Código no seguro.

Y despues en tu codigo la parte no segura dejarla como sigue :

Código: Text
  1. unsafe
  2. {
  3.    //Acá Tu código
  4. }
  5.  

Suerte.
              [size=109]"Has lo que digo y no hagas lo que hago"[/size]

Scherzo

  • Miembro activo
  • **
  • Mensajes: 64
    • Ver Perfil
    • http://www.mma-spain.com
Re: Referenciar Variables Sin Código Inseguro (unsafe)
« Respuesta #2 en: Miércoles 29 de Agosto de 2007, 16:43 »
0
Hola, gracias por la rápida contestación.

He visto lo que me has indicado en las opciones de compilación de un proyecto normal, pero en mi caso estoy desarrollando un Web Service y parece que esa opción no aparece entre las opciones de los Web Service, ¿puede ser que no sea posible utilizar código "unsafe" en un servicio web?.

Por otro lado, salvo aplicando la solución que has propuesto, ¿sabes si es posible hacerlo sin utilizar código "unsafe" o no queda más remedio que utilizar código "unsafe"?

Saludos y gracias nuevamente

Neopro

  • Miembro MUY activo
  • ***
  • Mensajes: 316
    • Ver Perfil
Re: Referenciar Variables Sin Código Inseguro (unsafe)
« Respuesta #3 en: Miércoles 29 de Agosto de 2007, 17:20 »
0
Tienes razon, la opcion es para aplicaciones normales y no web.

Y si la única forma es hacerlo dentro de unsafe o declarar una funcion completa como unsafe.

No se si admite al compilador depurar eso, se debe hacer agregando /unsafe si complicas por consola, pero no se como se hace con WebService.

Suerte.
              [size=109]"Has lo que digo y no hagas lo que hago"[/size]

Mollense

  • Miembro de PLATA
  • *****
  • Mensajes: 1755
  • Nacionalidad: ar
    • Ver Perfil
    • http://solocodigo.com/
Re: Referenciar Variables Sin Código Inseguro (unsafe)
« Respuesta #4 en: Miércoles 29 de Agosto de 2007, 19:19 »
0
Yo no te entiendo muy bien. ¿Podrías explicarte un poquito mejor?¿Como quisieras hacerlo?
"Los que renuncian son más numerosos que los que fracasan" H.F.
"No se cómo sería la III Guerra Mundial, pero la cuarta sería con piedras" A.E.
"Quién no fía no es de fiar..."


...no te quedes mirando.

Scherzo

  • Miembro activo
  • **
  • Mensajes: 64
    • Ver Perfil
    • http://www.mma-spain.com
Re: Referenciar Variables Sin Código Inseguro (unsafe)
« Respuesta #5 en: Jueves 30 de Agosto de 2007, 12:29 »
0
Hola de nuevo, perdona, quizá me expliqué un poco atropelladamente por las prisas.

Mi idea es simular el concepto de un puntero, pero dentro de C# y sin usar código unsafe (que parece ser que es la única forma de poder utilizar punteros). Es decir, cuando yo tengo un objeto y lo igualo a otro, realmente este primer objeto está apuntando al segundo (lo que llaman referenciar), no está copiando su contenido. Entonces sería intentar hacer lo mismo pero con variables de tipo value, las cuales cuando una se iguala a otra sí que copia su contenido.

He intentado representar gráficamente mi idea, espero que así se vea más clara (te adjunto la imagen porque parece ser que todavía no tengo permisos para poder incluir enlaces en los mensaje --la había subido a ImageShack--):

¿Se ve más claro con el esquema?

Saludos y gracias
El mensaje contiene 1 archivo adjunto. Debes ingresar o registrarte para poder verlo y descargarlo.

Neopro

  • Miembro MUY activo
  • ***
  • Mensajes: 316
    • Ver Perfil
Re: Referenciar Variables Sin Código Inseguro (unsafe)
« Respuesta #6 en: Jueves 30 de Agosto de 2007, 15:47 »
0
Aaaaaaaaaaaahh...

Cambia la cosa, o sea es manejo de punteros, lo puedes hacer de forma muy parecida a C++ y tambien lo puedes hacer utiliazndo las palabras reservadas REF y OUT.

Ejemplo   Descripción
int* p  p es un puntero a un entero
int** p  p es un puntero a un puntero o a un entero
int*[] p  p es una matriz unidimensional de punteros a enteros
char* p  p es un puntero a un valor char
void* p  p es un puntero a un tipo desconocido

Operador/instrucción  Uso  
* Para realizar el direccionamiento indirecto de puntero.
-> Para tener acceso a un miembro de una estructura a través de un puntero.
[] Para indizar un puntero.
&   Para obtener la dirección de una variable.
++ y --  Para incrementar y reducir punteros.
+ y - Para realizar aritmética de punteros.
==, !=, <, >, <= y >=  Para comparar punteros.
stackalloc  Para asignar memoria en la pila.
fixed (Instrucción) Para hacer que una variable sea temporalmente fija para que pueda encontrarse su dirección.
 
en C# no siempre el manejo de punteros significa que sea codigo no seguro.

Y ante cualquier eventualidad, lo ideal es que cuando hagas esos llamados, sean mediante try catch, solo como sugerencia.

Suerte.

Un enlaces utiles :

 Enlace

REF

OUT
              [size=109]"Has lo que digo y no hagas lo que hago"[/size]

Scherzo

  • Miembro activo
  • **
  • Mensajes: 64
    • Ver Perfil
    • http://www.mma-spain.com
Re: Referenciar Variables Sin Código Inseguro (unsafe)
« Respuesta #7 en: Jueves 30 de Agosto de 2007, 16:26 »
0
Gracias por la respuesta, pero leyéndola me surge de nuevo una duda que no me queda del todo clara.

Todo lo que he podido leer (y probar) me da a entender que la única forma de usar punteros es mediante código unsafe. Bien, como lo que quiero hacer quisiera hacerlo sin usar código unsafe, la pregunta del millón sería, ¿se puede hacer lo que necesito sin usar punteros (en el caso que de verdad requieran código unsafe)?, o lo que me valdría igualmente, ¿se pueden usar punteros sin usar código unsafe?. Si es así, ¿sabríais cómo?

Saludos y muchas gracias

Neopro

  • Miembro MUY activo
  • ***
  • Mensajes: 316
    • Ver Perfil
Re: Referenciar Variables Sin Código Inseguro (unsafe)
« Respuesta #8 en: Jueves 30 de Agosto de 2007, 16:46 »
0
La opcion es usar valores por referencia con REF u OUT como te indicaba anteriormente, parecido al manejo en Pascal, alli no es necesario unsafe.

No hay mas alternativa.
              [size=109]"Has lo que digo y no hagas lo que hago"[/size]

Scherzo

  • Miembro activo
  • **
  • Mensajes: 64
    • Ver Perfil
    • http://www.mma-spain.com
Re: Referenciar Variables Sin Código Inseguro (unsafe)
« Respuesta #9 en: Jueves 30 de Agosto de 2007, 17:23 »
0
Oks, gracias, entiendo por lo tanto que eso implica el uso de funciones, ya que para poder usar REF y OUT he de hacerlo en el paso de parámetros.

Saludos y gracias por los comentarios, han sido muy clarificadores.

Mollense

  • Miembro de PLATA
  • *****
  • Mensajes: 1755
  • Nacionalidad: ar
    • Ver Perfil
    • http://solocodigo.com/
Re: Referenciar Variables Sin Código Inseguro (unsafe)
« Respuesta #10 en: Viernes 31 de Agosto de 2007, 05:22 »
0
Ahora entiendo  :rolleyes: .

Otra cosa que podrías hacer es crearte una clase con atributos estáticos que vendrían siendo los contadores y una función estática que actúe como una especie de Indizador (Ya que no se puede declara un indizador estático), algo así:
   
Código: Text
  1. class claseContador
  2.     {
  3.         private static int contadorClientes = 0;
  4.         private static int contadorProveedores = 0;
  5.         private static int contadorEmpleados = 0;
  6.  
  7.         public static int incrementar(string nombreTabla)
  8.         {
  9.             switch (nombreTabla.ToUpper())
  10.             {
  11.                 case &#34;CLIENTE&#34;:
  12.                     return ++claseContador.contadorClientes;
  13.                 break;
  14.                 case &#34;PROVEEDOR&#34;:
  15.                     return ++claseContador.contadorProveedores;
  16.                 break;
  17.                 case &#34;EMPLEADO&#34;:
  18.                     return ++claseContador.contadorEmpleados;
  19.                 break;
  20.                 default:
  21.                     return -1;
  22.                 break;
  23.             }
  24.         }
  25.     }
  26.  
De esta forma podrías incrementar cualquier contador desde cualquier parte del código sin siquiera instanciar un objeto de esta clase.

Ejemplo:
Código: Text
  1. MessageBox.Show(&#34;cliente: &#34; + claseContador.incrementar(&#34;cliente&#34;).ToString());
  2. MessageBox.Show(&#34;cliente: &#34; + claseContador.incrementar(&#34;cliente&#34;).ToString());
  3.  
  4. MessageBox.Show(&#34;proveedor: &#34; + claseContador.incrementar(&#34;proveedor&#34;).ToString());
  5. MessageBox.Show(&#34;proveedor: &#34; + claseContador.incrementar(&#34;proveedor&#34;).ToString());
  6. MessageBox.Show(&#34;proveedor: &#34; + claseContador.incrementar(&#34;proveedor&#34;).ToString());
  7.  
  8. MessageBox.Show(&#34;empleado: &#34; + claseContador.incrementar(&#34;empleado&#34;).ToString());
  9. MessageBox.Show(&#34;empleado: &#34; + claseContador.incrementar(&#34;empleado&#34;).ToString());
  10.  

Podrías agregarle otras funciones estáticas como ser: decrementar, valorActual, etc-

Un saludo y espero que sirva. :beer:
"Los que renuncian son más numerosos que los que fracasan" H.F.
"No se cómo sería la III Guerra Mundial, pero la cuarta sería con piedras" A.E.
"Quién no fía no es de fiar..."


...no te quedes mirando.

Scherzo

  • Miembro activo
  • **
  • Mensajes: 64
    • Ver Perfil
    • http://www.mma-spain.com
Re: Referenciar Variables Sin Código Inseguro (unsafe)
« Respuesta #11 en: Viernes 31 de Agosto de 2007, 10:56 »
0
Gracias por la sugerencia, es un planteamiento interesante el montarlo como una clase en lugar de como una colección de variables-contadores independientes. Permitiría dejar un código más limpio y manejable, con la posibilidad de añadir de forma sencilla futuras funcionalidades en caso de necesidad (como métodos que generen estadísticas de uso, etc).

Por cierto, y ya que hemos estado tratando el tema del código inseguro. ¿Conoceis algún buen enlace donde haya alguna explicación técnica de las implicaciones que tiene el uso de código inseguro frente al código normal?. Es que los he podido encontrar se limitan a comentar muy por encima lo que es, pero no profundiza a nivel técnico.

Saludos y gracias nuevamente.