new La palabra clave new se utiliza en tres escenarios distintos: la instanciación más común de objetos, las restricciones de parámetros genéricos, y la ocultación explícita de miembros heredados.
using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using static System.Console;
namespace ConceptosBasicos
{
class NewKeywordDemo : IDemo
{
public void Ejecutar()
{
//new 1: instanciación de objetos
var tabla = new DataTable();
//new 2: paso de instancia a método genérico
Mostrar<Animal>(new Perro());
//new 3: ocultación de miembro heredado
Animal animal = new Perro();
animal.Imprimir();
}
//new 2: restricción de constructor sin parámetros
static void Mostrar<T>(T entidad) where T : new()
{
WriteLine(entidad.GetType());
}
#region new 3: ocultación de miembro
public class Animal
{
public virtual void Imprimir()
{
WriteLine("Animal: método Imprimir");
}
public virtual void Observar()
{
}
}
public class Perro : Animal
{
//new 3: ocultar método heredado
public new void Imprimir()
{
WriteLine("Perro: método Imprimir");
}
public override void Observar()
{
}
}
#endregion
}
}
default La palabra clave default tiene dos usos principales: obtener el valor predeterminado de un tipo y representar un caso por defecto en estructuras switch.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using static System.Console;
namespace ConceptosBasicos
{
class DefaultKeywordDemo : IDemo
{
public void Ejecutar()
{
//default 1: valores predeterminados de tipos
WriteLine(default(int));
WriteLine(default(bool));
WriteLine(default(DateTime));
WriteLine(default(string));
switch (default(string))
{
case "":
WriteLine("Cadena vacía");
break;
case null:
WriteLine("Valor null");
break;
//default 2: caso por defecto en switch
default:
WriteLine("Otro valor");
break;
}
}
}
}
out La palabra cllave out se emplea en dos contextos: como parámetro de salida para retornar valores desde métodos, y en la declaración covariante de interfaces y delegados.
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using static System.Console;
namespace ConceptosBasicos
{
class OutKeywordDemo : IDemo
{
public void Ejecutar()
{
//out 1: parámetro de salida
Calcular(out int resultado);
WriteLine(resultado);
WriteLine("------------");
IContenedor<object> contenedor1 = new Implementacion<object>();
IContenedor<object> contenedor2 = new Implementacion<string>();
WriteLine(contenedor1.GetType());
WriteLine(contenedor2.GetType());
contenedor1.Mostrar();
contenedor2.Mostrar();
contenedor1 = contenedor2;
contenedor1.Mostrar();
}
//out 1: método con parámetro de salida
public void Calcular(out int valor)
{
valor = 25;
}
//out 2: interfaz covariante
interface IContenedor<out R>
{
R Obtener();
}
class Implementacion<R> : IContenedor<R>
{
public R Obtener()
{
var valor = default(R);
WriteLine($"{typeof(R).Name}");
return valor;
}
}
}
}