Tipos y variables en c#
Tipos y variables C#
Hay dos clases de tipos en C#: tipos de valor y tipos de referencia. Las variables de tipos de valor contienen directamente los datos, mientras que las variables de los tipos de referencia almacenan referencias a los datos, lo que se conoce como objetos. Con los tipos de referencia, es posible que dos variables hagan referencia al mismo objeto y que, por tanto, las operaciones en una variable afecten al objeto al que hace referencia la otra variable.Con los tipos de valor, cada variable tiene su propia copia de los datos y no es posible que las operaciones en una variable afecten a la otra (excepto en el caso de las variables de parámetro
ref
y out
).
Los tipos de valor de C# se dividen en tipos simples, tipos de enumeración, tipos de estructura y tipos de valores NULL. Los tipos de referencia de C# se dividen en tipos de clase, tipos de interfaz, tipos de matriz y tipos delegados.
A continuación se proporciona información general del sistema de tipos de C#.
- Tipos de valor
- Tipos simples
- Entero con signo:
sbyte
,short
,int
,long
- Entero sin signo:
byte
,ushort
,uint
,ulong
- Caracteres Unicode:
char
- Punto flotante de IEEE:
float
,double
- Decimal de alta precisión:
decimal
- Booleano:
bool
- Entero con signo:
- Tipos de enumeración
- Tipos definidos por el usuario con el formato
enum E {...}
- Tipos definidos por el usuario con el formato
- Tipos de estructura
- Tipos definidos por el usuario con el formato
struct S {...}
- Tipos definidos por el usuario con el formato
- Tipos de valor que aceptan valores NULL
- Extensiones de todos los demás tipos de valor con un valor
null
- Extensiones de todos los demás tipos de valor con un valor
- Tipos simples
- Tipos de referencia
- Tipos de clase
- Clase base definitiva de todos los demás tipos:
object
- Cadenas Unicode:
string
- Tipos definidos por el usuario con el formato
class C {...}
- Clase base definitiva de todos los demás tipos:
- Tipos de interfaz
- Tipos definidos por el usuario con el formato
interface I {...}
- Tipos definidos por el usuario con el formato
- Tipos de matriz
- Unidimensional y multidimensional; por ejemplo,
int[]
yint[,]
- Unidimensional y multidimensional; por ejemplo,
- Tipos delegados
- Tipos definidos por el usuario con el formato
delegate int D(...)
- Tipos definidos por el usuario con el formato
- Tipos de clase
Los ocho tipos enteros proporcionan compatibilidad con valores de 8, 16, 32 y 64 bits en formato con o sin signo.
Los dos tipos de punto flotante,
float
y double
, se representan mediante los formatos IEC-60559 de precisión sencilla de 32 bits y de doble precisión de 64 bits, respectivamente.
El tipo
decimal
es un tipo de datos de 128 bits adecuado para cálculos financieros y monetarios.
El tipo
bool
de C# se utiliza para representar valores booleanos; valores que son true
o false
.
El procesamiento de caracteres y cadenas en C# utiliza la codificación Unicode. El tipo
char
representa una unidad de código UTF-16 y el tipo string
representa una secuencia de unidades de código UTF-16.
Resume los tipos numéricos de C#.
- Entero con signo
sbyte
: 8 bits, de -128 a 127short
: 16 bits, de -32,768 a 32,767int
: 32 bits, de -2,147,483,648 a 2,147,483,647long
: 64 bits, de -9,223,372,036,854,775,808 a 9,223,372,036,854,775,807
- Entero sin signo
byte
: 8 bits, de 0 a 255ushort
: 16 bits, de 0 a 65,535uint
: 32 bits, de 0 a 4,294,967,295ulong
: 64 bits, de 0 a 18,446,744,073,709,551,615
- Punto flotante
float
: 32 bits, de 1.5 × 10−45 a 3.4 × 1038, precisión de 7 dígitosdouble
: 64 bits, de 5.0 × 10−324 a 1.7 × 10308, precisión de 15 dígitos
- Decimal
decimal
: 128 bits, al menos de –7.9 × 10−28 a 7.9 × 1028, con una precisión mínima de 28 dígitos
Los programas de C# utilizan declaraciones de tipos para crear nuevos tipos. Una declaración de tipos especifica el nombre y los miembros del nuevo tipo. Cinco de las categorías de tipos de C# las define el usuario: tipos de clase, tipos de estructura, tipos de interfaz, tipos de enumeración y tipos delegados.
A tipo
class
define una estructura de datos que contiene miembros de datos (campos) y miembros de función (métodos, propiedades y otros). Los tipos de clase admiten herencia única y polimorfismo, mecanismos por los que las clases derivadas pueden extender y especializar clases base.
Un tipo
struct
es similar a un tipo de clase, por el hecho de que representa una estructura con miembros de datos y miembros de función. Sin embargo, a diferencia de las clases, las estructuras son tipos de valor y no suelen requerir la asignación del montón. Los tipos struct no admiten la herencia especificada por el usuario y todos los tipos de struct se heredan implícitamente del tipo object
.
Un tipo
interface
define un contrato como un conjunto con nombre de miembros de función públicos. Un class
o struct
que implementa un interface
debe proporcionar implementaciones de miembros de función de la interfaz. Un interface
puede heredar de varias interfaces base, y un class
o struct
pueden implementar varias interfaces.
Un tipo
delegate
representa las referencias a métodos con una lista de parámetros determinada y un tipo de valor devuelto. Los delegados permiten tratar métodos como entidades que se puedan asignar a variables y se puedan pasar como parámetros. Los delegados son análogos a los tipos de función proporcionados por los lenguajes funcionales. Son similares al concepto de punteros de función en otros lenguajes, pero a diferencia de los punteros de función, los delegados están orientados a objetos y presentan seguridad de tipos.
Los tipos
class
, struct
, interface
y delegate
admiten parámetros genéricos, mediante los cuales se pueden parametrizar con otros tipos.
Un tipo
enum
es un tipo distinto con constantes con nombre. Cada tipo enum
tiene un tipo subyacente, que debe ser uno de los ocho tipos enteros.El conjunto de valores de un tipo enum
es igual que el conjunto de valores del tipo subyacente.
C# admite matrices unidimensionales y multidimensionales de cualquier tipo. A diferencia de los tipos enumerados anteriormente, los tipos de matriz no tienen que ser declarados antes de usarlos. En su lugar, los tipos de matriz se crean mediante un nombre de tipo entre corchetes. Por ejemplo,
int[]
es una matriz unidimensional de int
, int[,]
es una matriz bidimensional de int
y int[][]
es una matriz unidimensional de la matriz unidimensional de int
.
Los tipos de valor NULL tampoco tienen que ser declarados antes de usarlos. Para cada tipo de valor distinto de NULL
T
, existe un tipo de valor NULL correspondiente T?
, que puede tener un valor adicional, null
. Por ejemplo, int?
es un tipo que puede contener cualquier número entero de 32 bits o el valor null
.
El sistema de tipos de C# está unificado, de tal forma que un valor de cualquier tipo puede tratarse como un
object
. Todos los tipos de C# directa o indirectamente se derivan del tipo de clase object
, y object
es la clase base definitiva de todos los tipos. Los valores de tipos de referencia se tratan como objetos mediante la visualización de los valores como tipo object
. Los valores de tipos de valor se tratan como objetos mediante la realización de operaciones de conversión boxing y operaciones de conversión unboxing. En el ejemplo siguiente, un valor int
se convierte en object
y vuelve a int
.
C#
using System;
class BoxingExample
{
static void Main()
{
int i = 123;
object o = i; // Boxing
int j = (int)o; // Unboxing
}
}
Cuando se convierte un valor de un tipo de valor al tipo
object
, se asigna una instancia object
, también denominada "box", para contener el valor, y el valor se copia en dicho box. Por el contrario, cuando se convierte una referencia object
en un tipo de valor, se comprueba si la referencia object
es un box del tipo de valor correcto y, si la comprobación es correcta, se copia el valor del box.
El sistema de tipos unificado de C# conlleva efectivamente que los tipos de valor pueden convertirse en objetos "a petición". Debido a la unificación, las bibliotecas de uso general que utilizan el tipo
object
pueden usarse con tipos de referencia y tipos de valor.
Hay varios tipos de variables en C#, entre otras, campos, elementos de matriz, variables locales y parámetros. Las variables representan ubicaciones de almacenamiento, y cada variable tiene un tipo que determina qué valores pueden almacenarse en la variable, como se muestra a continuación.
- Tipo de valor distinto a NULL
- Un valor de ese tipo exacto
- Tipos de valor NULL
- Un valor
null
o un valor de ese tipo exacto
- Un valor
- objeto
- Una referencia
null
, una referencia a un objeto de cualquier tipo de referencia o una referencia a un valor de conversión boxing de cualquier tipo de valor
- Una referencia
- Tipo de clase
- Una referencia
null
, una referencia a una instancia de ese tipo de clase o una referencia a una instancia de una clase derivada de ese tipo de clase
- Una referencia
- Tipo de interfaz
- Un referencia
null
, una referencia a una instancia de un tipo de clase que implementa dicho tipo de interfaz o una referencia a un valor de conversión boxing de un tipo de valor que implementa dicho tipo de interfaz
- Un referencia
- Tipo de matriz
- Una referencia
null
, una referencia a una instancia de ese tipo de matriz o una referencia a una instancia de un tipo de matriz compatible
- Una referencia
- Tipo delegado
- Una referencia
null
o una referencia a una instancia de un tipo delegado compatible
- Una referencia
No hay comentarios.