Definición de clase

Programación procedural y programación orientada a objetos

Antes de la aparición de las clases, lenguajes como C no contaban con este concepto. El estilo de programación sin clases ni objetos, propio de lenguajes como C, se denomina programación procedural.

Programación procedural: un programa es una secuencia de instrucciones, y su objetivo principal es optimizar los pasos de ejecución.

Gracias a la existencia de las clases, podemos desarrollar programación orientada a objetos.

Programación orientada a objetos: el programa está formado por un conjunto de clases encapsuladas. La idea fundamental es agrupar los datos y las funciones que manipulan dichos datos en unidades lógicamente relacionadas; estas unidades reciben el nombre de clases (class).

Definición de clase

Una clase es una estructura de datos que contiene datos almacenados y código ejecutable. Cuenta con dos tipos de miembros:

  1. Miembros de datos (Data Members): almacenan los atributos del objeto: campos (Fields), constantes (Constants)
  2. Miembros de función (Function Members): implementan la lógica de comportamiento de los objetos: métodos, propiedades, constructores, destructores, operadores, indexadores, eventos

La clase es un conjunto que encapsula datos y funciones con relación lógica, empleado para modelar entidades del mundo real o abstracto.

En pocas palabras, una clase es una estructura de datos formada por datos y funciones. Se pueden crear objetos a partir de una clase; se accede a los datos y miembros mediante los objetos, y también directamente desde el interior de la clase.

Declaración de clase

La palabra clave class solo define una plantilla de clase, no crea instancias de objetos. Una plantilla consta de tres partes: nombre de la clase, miembros de la clase y características de la clase.

Sintaxis

class NombreClase
{
    // declaración de miembros (campos, métodos, el orden no es obligatorio)
}Lenguaje del código: JavaScript (javascript)

La declaración de clase también se conoce habitualmente como definición de clase (class definition)


class Program
{
    static void Main(string[] args)
    {
        AddCalculator addCalculator = new AddCalculator();
        SubCalculator subCalculator = new SubCalculator();
    }
}


class AddCalculator
{
    public int A { get; set; }
    public int B { get; set; }
    public int Add()
    {
        return A + B;
    }
}

class SubCalculator
{
    public int A { get; set; }
    public int B { get; set; }
    public int Subtract()
    {
        return A - B;
    }
}Lenguaje del código: JavaScript (javascript)

En el ejemplo anterior se declaran dos clases: una para realizar sumas y otra para restas. Dentro de la función Main del programa principal creamos instancias de ambas clases para utilizarlas.

Contenido proveniente de foxdevelop.com

No es obligatorio escribir las declaraciones de clase en orden de arriba hacia abajo. Puedes declarar clases en la parte inferior del código y llamarlas desde la función Main situada más arriba. La clase no es más que una plantilla o plano. El código no se ejecuta secuencialmente desde arriba; la ejecución empieza en Main y el programa busca la plantilla correspondiente cuando la necesita.

Miembros de clase

Campos (Fields)

Un campo es una variable perteneciente a una clase. Puede ser de tipo nativo o definido por el usuario y admite operaciones de lectura y escritura de datos.

Tipo NombreCampo;
class MyClass
{
    int MyField; // campo de tipo int llamado MyField
}Lenguaje del código: JavaScript (javascript)

Diferencia importante respecto a C/C++: C# no dispone de variables globales. Todos los campos deben declararse dentro de un tipo (clase o estructura).

Reglas de inicialización de campos

(1) Inicialización implícita (sin asignación de valor)

El compilador asigna automáticamente un valor predeterminado según el tipo; cada tipo tiene un valor predeterminado distinto.

int F1;    // valor predeterminado 0
string F2; // valor predeterminado nullLenguaje del código: JavaScript (javascript)

La siguiente tabla recoge los tipos de C# y sus valores predeterminados para campos. Esta regla solo aplica a campos; las variables locales deben ser inicializadas manualmente por el desarrollador.

Tipos de valor primitivos

Tipo de datoValor predeterminadoDescripción
sbyte0Entero de 8 bits con signo
byte0Entero de 8 bits sin signo
short0Entero de 16 bits con signo
ushort0Entero de 16 bits sin signo
int0Entero de 32 bits con signo
uint0Entero de 32 bits sin signo
long0LEntero de 64 bits con signo
ulong0ULEntero de 64 bits sin signo
float0.0fNúmero de coma flotante simple precisión
double0.0dNúmero de coma flotante doble precisión
decimal0.0mDecimal de alta precisión
char'\0' (carácter nulo, ASCII 0)Carácter individual
boolfalseTipo booleano
Enumeración EnumElemento de enumeración correspondiente al entero base 0Las enumeraciones se basan en enteros, valor predeterminado 0
Estructura structCada campo toma su valor predeterminado correspondienteTipo de valor personalizado, se inicializa a cero en su totalidad

Tipos de referencia

Todos los tipos de referencia tienen como valor predeterminado null, lo que significa que no apuntan a ningún objeto en el área de memoria heap.

Es decir, no almacenan ninguna dirección de memoria válida. Recuerda el diagrama de memoria visto anteriormente: los tipos de referencia guardan direcciones de heap como 000001 01010. Cuando el valor es null, no hay ninguna dirección válida almacenada.

Categoría de tipoEjemplos de tiposValor predeterminado
Tipos de referencia nativosstring, objectnull
Clase personalizada classPerson Studentnull
Arrays (todas las dimensiones)int[], string[,]null
Delegados / EventosAction, Func, delegado personalizadonull
Interfaz interfaceCualquier variable de interfaznull

Ejemplos

string str;        // predeterminado null
Student jason;     // clase personalizada, predeterminado null
int[] arr;         // array, predeterminado null
Action callback;   // delegado, predeterminado nullLenguaje del código: JavaScript (javascript)

Tipos que admiten null (Nullable / T?)

Si añadimos un signo de interrogación ? después de un tipo de valor primitivo, creamos un nuevo tipo capaz de no almacenar ningún valor. Por ejemplo, int age; vale 0 por defecto si no se asigna valor. Si queremos indicar explícitamente que no existe valor alguno, escribimos int? age2;. age2 es un tipo nullable y admite asignar null: int? age2 = null;

Un tipo nullable es un ValueType encapsulado, su valor predeterminado es null, lo que significa «sin valor válido».

Sintaxis de declaraciónValor predeterminado
int? numnull
bool? flagnull
decimal? pricenull
class Test
{
    int a;      // automáticamente 0
    string b;   // automáticamente null
    bool c;     // automáticamente false
}Lenguaje del código: JavaScript (javascript)

(2) Inicialización explícita

Asigna un valor mediante = en el momento de declaración. El valor asignado debe ser determinable en tiempo de compilación; no se admiten valores aleatorios ni entradas de usuario directamente.

int days = 25;
string word = "foxdevelop";Lenguaje del código: JavaScript (javascript)
(3) Sintaxis abreviada para varios campos del mismo tipo

Varias variables del mismo tipo se pueden declarar juntas separadas por comas. Está prohibido mezclar tipos distintos en una misma línea de declaración

int player, blood = 25;
string title, subTitle = "hi welcome to foxdevelop.com";Lenguaje del código: JavaScript (javascript)

Métodos (Methods)

Definición de método

Un método es un bloque de código nombrado, reutilizable y ejecutable, equivalente a las funciones miembro de C++. Al invocarse ejecuta su código interno y devuelve el control al punto de llamada. Se clasifican en métodos con valor de retorno y métodos sin valor de retorno.

Cuatro componentes de un método

  1. Tipo de retorno: escribe void si no devuelve ningún valor
  2. Nombre del método
  3. Lista de parámetros: los paréntesis () son obligatorios incluso sin parámetros
  4. Cuerpo del método: código ejecutable delimitado por {}

class Program
{
    static void Main(string[] args)
    {
        Robot robot = new Robot();
        robot.SayHello();
    }
}


class Robot
{
    public void SayHello()
    {
        Console.WriteLine("Hello everyone");
        Console.WriteLine("Welcome to visit foxdevelop.com");
    }
}Lenguaje del código: JavaScript (javascript)

La palabra reservada public delante de public void SayHello() es un modificador de acceso, permite invocar la función desde fuera de la clase mediante la sintaxis nombreObjeto.NombreMetodo. Si no se escribe public, el nivel de acceso predeterminado es private. Los métodos privados solo se pueden llamar dentro de la clase; no son accesibles desde el exterior incluso usando una instancia como robot.

Creación de variables de clase e instancias

1. Características fundamentales de los tipos de referencia

Las clases pertenecen a los tipos de referencia. La memoria se divide en dos zonas:

  1. Pila (Stack): almacena variables de referencia (punteros a direcciones de memoria)
  2. Montón (Heap): almacena los datos reales de los objetos

2. Creación de un objeto paso a paso

1 Solo declaración de la variable de referencia (solo se asigna memoria en la pila, sin objetos en el montón)
Robot robot; 
// Solo se reserva espacio para la referencia en la pila, valor indefinido, no existe ningún objeto en el montón
Lenguaje del código: JavaScript (javascript)
Este código crea una variable en la pila para guardar una referencia a Robot (dirección del montón), pero en este momento vale null y está vacía.

2 Asignación de memoria en el montón con el operador new

new NombreTipo();Lenguaje del código: JavaScript (javascript)
  1. Reserva memoria en el montón e inicializa automáticamente todos los campos con sus valores predeterminados
  2. Devuelve la dirección de referencia del objeto del montón y se asigna a la variable de la pila
robot = new Robot();
Lenguaje del código: JavaScript (javascript)
class Program
{
    static void Main(string[] args)
    {
        Robot robot;
        robot = new Robot();
    }
}


class Robot
{
    void SayHello()
    {
        Console.WriteLine("Hello everyone");
        Console.WriteLine("Welcome to visit foxdevelop.com");
    }
}Lenguaje del código: JavaScript (javascript)
3. Declaración e instanciación en una única línea
Robot robot = new Robot();Lenguaje del código: JavaScript (javascript)
class Program
{
    static void Main(string[] args)
    {
        Robot robot = new Robot();
    }
}Lenguaje del código: JavaScript (javascript)

Definición de clase

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *