Palabras clave con múltiples significados en C#

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;
            }
        }
    }
}

Etiquetas: C# palabras-clave polimorfismo new default

Publicado el 10-9 00:24