duda sobre tipos por valor y referencia

17/07/2005 - 15:33 por luis | Informe spam
Según he leido en C# todo son objetos incluso los tipos básicos como int,
long, ... y que todos derivan de la clase base Object. Esto es al contrario
de Java donde los tipos básicos no son objetos.
Esto provoca una mayor sobrecarga pero en C# se han creado como de tipo "por
valor" con lo que almacenan directamente su contenido y no una referencia a
los datos.

Pero luego leo en la documentanción del msdn esto:

"Boxing y unboxing permiten tratar a los tipos de valor como objetos. Los
tipos de valor, incluidos los de estructura y los integrados, como int, se
pueden convertir al tipo object y desde el tipo object".



¿Pero no me están diciendo que estos tipos básico si son objetos? ¿O es que
no son objetos al igual que en Java?

Preguntas similare

Leer las respuestas

#6 Alfredo Novoa
17/07/2005 - 21:29 | Informe spam
On Sun, 17 Jul 2005 18:33:55 +0200, "luis"
wrote:

Siento ser tan pesado pero el boxing automático también podría hacerse a una
variable de "las de toda la vida" ¿no?.



Claro.

Además he seguido buscando y en un libro he encontrado, allá por la página
400, que hasta ahora me decían que todo en C# era un objeto pero que en
realidad lo que pasa es que todo puede ser TRATADO como objeto.



Decir que todo es un objeto es como decir que todo es una cosa. Es
como no decir nada.

Para alguna gente los objetos son solo valores y variables de tipo
referencia, pero esto es una restricción arbitraria. Cada uno le llama
objeto a lo que le da la gana: valores, variables, tipos, etc. Lo
único que tienen en común todos los objetos es que son cosas. Esto
hace que la palabra "objeto" sea muy poco precisa y científica. En un
mismo párrafo nos podemos encontrar la palabra "objeto" con tres o más
significados distintos.

Por ello
podemos usar métodos en literales (como "hola".ToUpper()) ya que supongo C#
les hará el boxing y se creará un objeto.



Se creará un valor de tipo referencia.

Es que que las variables "por valor" guarden directamente su contenido, que
no admitan nulos, que al asignarlas a otra variable se pase el valor de la
misma y no su referencia no es más que la definición de variable de toda la
vida.



Claro, aunque las variables de tipo puntero (referencia) también
existen de toda la vida.


Saludos
Respuesta Responder a este mensaje
#7 Alfredo Novoa
17/07/2005 - 21:43 | Informe spam
On Sun, 17 Jul 2005 20:33:16 +0200, "luis"
wrote:

Una reformulación de la pregunta:

Si en C# los tipos básicos son objetos ¿qué ventaja supone sobre Java?. En
Java estos tipos no son objetos habiendo el problema de necesitar realizar
conversiones implícitas cuando era necesario. Pero en Java 1.5 se ha
incluido la capacidad de boxing automático y estos tipos de datos básicos
siguen sin ser objetos.



Lo único que cambia es la definición de objeto que usan unos y otros.

La terminología de .Net es mejor (o por lo menos es menos mala), por
que no establece una distinción arbitraria entre valores, variables,
tipos y demás que son objetos y los que no lo son.

En un texto técnico habría que evitar usar términos tan poco precisos
como "objeto" o "cosa".


Saludos
Respuesta Responder a este mensaje
#8 Octavio Hernandez
17/07/2005 - 22:14 | Informe spam
Luis,

Puntualizando en lo que dice Alfredo, la idea no es tanto que los tipos
valor de C# son objetos, como que pueden ser convertidos a tipos referencia
en el momento necesario y de manera transparente para el programador.

Precisamente en Java 1.5 lo que han hecho es extender las posibilidades del
lenguaje para intentar ponerlo a la altura de lo que ofrece C#. En las
versiones anteriores de Java el proceso de "boxing" era totalmente manual y
responsabilidad del programador.

Pero ojo, que la próxima versión de C# le dará una nueva vuelta de tuerca al
asunto, y por ejemplo incluirá los tipos anulables (nullable types), que nos
permitirán asignar el valor null a tipos valor...

Slds - Octavio

"luis" escribió en el mensaje
news:
Una reformulación de la pregunta:

Si en C# los tipos básicos son objetos ¿qué ventaja supone sobre Java?. En
Java estos tipos no son objetos habiendo el problema de necesitar realizar
conversiones implícitas cuando era necesario. Pero en Java 1.5 se ha
incluido la capacidad de boxing automático y estos tipos de datos básicos
siguen sin ser objetos.



"luis" escribió en el mensaje
news:%
Siento ser tan pesado pero el boxing automático también podría hacerse a


una
variable de "las de toda la vida" ¿no?. Creo que es lo que hace la nueva
versión de Java.

Además he seguido buscando y en un libro he encontrado, allá por la
página
400, que hasta ahora me decían que todo en C# era un objeto pero que en
realidad lo que pasa es que todo puede ser TRATADO como objeto. Por ello
podemos usar métodos en literales (como "hola".ToUpper()) ya que supongo


C#
les hará el boxing y se creará un objeto.

Es que que las variables "por valor" guarden directamente su contenido,


que
no admitan nulos, que al asignarlas a otra variable se pase el valor de
la
misma y no su referencia no es más que la definición de variable de toda


la
vida.

Tal vez es que soy un tozudo y basta con que admita esta explicación y ya
está: son objetos y punto. Entiendo perfectamente sus diferencias en


cuanto
a comportamiento y detalles a tener en cuenta al programar pero ...




"Alfredo Novoa" escribió en el mensaje
news:
> On Sun, 17 Jul 2005 17:40:33 +0200, "luis"
> wrote:
>
> >Gracias pero otra duda. Si estas variables guardan directamente su


valor,
si
> >cuando asignamos su valor a otra variable lo que hacemos es asignarle


su
> >valor y no se dirección de memoria, si no admiten null, ... ¿en qué se
> >diferencian de otras variables "normales" de otros lenguajes?
>
> En que cuando asignamos su valor a otra variable de tipo referencia se
> crea automáticamente un valor de tipo referencia y entonces si se
> asigna un puntero.
>
> Ejemplo:
>
> int i = 1;
>
> Se asigna un valor
>
> object o = i;
>
> Se crea una nueva variable de tipo referencia y se asigna un puntero.
>
> Esto es equivalente a:
>
> int i = 1;
> object o = new Integer(i);
>
>
> Saludos






email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una pregunta AnteriorRespuesta Tengo una respuesta
Search Busqueda sugerida