C# Clases (Class)

Cuando defines una clase, defines un modelo (blueprint) de un tipo de datos. Esto en realidad no define ningún dato, pero define qué significa el nombre de la clase, es decir, de qué está compuesto un objeto de la clase y qué operaciones se pueden realizar sobre ese objeto. Un objeto es una instancia de una clase. Los métodos y variables que constituyen la clase se denominan miembros de la clase.

Definición de clases

La definición de una clase comienza con la palabra claveclassy continúa con el nombre de la clase. El cuerpo de la clase se encierra entre un par de llaves. A continuación se muestra la forma general de la definición de una clase:

<access specifier> class  class_name
{
    // member variables
    <access specifier> <data type> variable1;
    <access specifier> <data type> variable2;
    ...
    <access specifier> <data type> variableN;
    // member methods
    <access specifier> <return type> method1(parameter_list)
    {
        // method body
    }
    <access specifier> <return type> method2(parameter_list)
    {
        // method body
    }
    ...
    <access specifier> <return type> methodN(parameter_list)
    {
        // method body
    }
}

Tenga en cuenta:

  • El especificador de acceso <access specifier> especifica las reglas de acceso para la clase y sus miembros. Si no se especifica, se utiliza el especificador de acceso predeterminado. El especificador de acceso predeterminado de una clase esinternaly el especificador de acceso predeterminado de un miembro esprivate。
  • El tipo de datos <data type> especifica el tipo de una variable; el tipo de retorno <return type> especifica el tipo de datos que devuelve el método.
  • Para acceder a los miembros de una clase, se utiliza el operador punto (.).
  • El operador punto vincula el nombre del objeto con el nombre del miembro.

El siguiente ejemplo ilustra los conceptos discutidos hasta ahora:

Ejemplo

using System;
namespace BoxApplication
{
    class Box
    {
       public double length;   // Longitud
       public double breadth;  // Ancho
       public double height;   // Altura
    }
    class Boxtester
    {
        static void Main(string[] args)
        {
            Box Box1 = new Box();        // Declara Box1, de tipo Box
            Box Box2 = new Box();        // Declara Box2, de tipo Box
            double volume = 0.0;         // Volumen

            // Detalles de Box1
            Box1.height = 5.0;
            Box1.length = 6.0;
            Box1.breadth = 7.0;

            // Detalles de Box2
            Box2.height = 10.0;
            Box2.length = 12.0;
            Box2.breadth = 13.0;
           
            // Volumen de Box1
            volume = Box1.height * Box1.length * Box1.breadth;
            Console.WriteLine("Volumen de Box1: {0}",  volume);

            // Volumen de Box2
            volume = Box2.height * Box2.length * Box2.breadth;
            Console.WriteLine("Volumen de Box2: {0}", volume);
            Console.ReadKey();
        }
    }
}

Cuando el código anterior se compila y ejecuta, produce el siguiente resultado:

Box1 的体积: 210
Box2 的体积: 1560

Funciones miembro y encapsulación

Una función miembro de una clase es una función que tiene su definición o prototipo dentro de la definición de la clase, al igual que otras variables. Como miembro de la clase, puede operar sobre cualquier objeto de la clase y acceder a todos los miembros de la clase de ese objeto.

Las variables miembro son atributos del objeto (desde una perspectiva de diseño) y se mantienen privadas para lograr encapsulación. Estas variables solo se pueden acceder mediante funciones miembro públicas.

Usemos los conceptos anteriores para establecer y obtener los valores de los diferentes miembros de una clase:

Ejemplo

using System;
namespace BoxApplication
{
    class Box
    {
       private double length;   // Longitud
       private double breadth;  // Ancho
       private double height;   // Altura
       public void setLength( double len )
       {
            length = len;
       }

       public void setBreadth( double bre )
       {
            breadth = bre;
       }

       public void setHeight( double hei )
       {
            height = hei;
       }
       public double getVolume()
       {
           return length * breadth * height;
       }
    }
    class Boxtester
    {
        static void Main(string[] args)
        {
            Box Box1 = new Box();        // Declara Box1, de tipo Box
            Box Box2 = new Box();        // Declara Box2, de tipo Box
            double volume;               // Volumen


            // Detalles de Box1
            Box1.setLength(6.0);
            Box1.setBreadth(7.0);
            Box1.setHeight(5.0);

            // Detalles de Box2
            Box2.setLength(12.0);
            Box2.setBreadth(13.0);
            Box2.setHeight(10.0);
       
            // Volumen de Box1
            volume = Box1.getVolume();
            Console.WriteLine("Volumen de Box1: {0}" ,volume);

            // Volumen de Box2
            volume = Box2.getVolume();
            Console.WriteLine("Volumen de Box2: {0}", volume);
           
            Console.ReadKey();
        }
    }
}

Cuando el código anterior se compila y ejecuta, produce el siguiente resultado:

Box1 的体积: 210
Box2 的体积: 1560

Constructores en C#

de la claseconstructores una función miembro especial de la clase que se ejecuta cuando se crea un nuevo objeto de la clase.

El nombre del constructor es exactamente igual al nombre de la clase y no tiene ningún tipo de retorno.

El siguiente ejemplo ilustra el concepto de constructor:

Ejemplo

using System;
namespace LineApplication
{
   class Line
   {
      private double length;   // Longitud de la línea
      public Line()
      {
         Console.WriteLine("Objeto creado");
      }

      public void setLength( double len )
      {
         length = len;
      }
      public double getLength()
      {
         return length;
      }

      static void Main(string[] args)
      {
         Line line = new Line();    
         // Establecer la longitud de la línea
         line.setLength(6.0);
         Console.WriteLine("Longitud de la línea: {0}", line.getLength());
         Console.ReadKey();
      }
   }
}

Cuando el código anterior se compila y ejecuta, produce el siguiente resultado:

对象已创建
线条的长度: 6

Constructor predeterminadoNo tiene ningún parámetro. Pero si necesitas un constructor con parámetros, puede tener parámetros; este tipo de constructor se llamaconstructor parametrizado. Esta técnica te ayuda a asignar valores iniciales al objeto al mismo tiempo que lo creas. Consulta el siguiente ejemplo:

Ejemplo


using System;
namespace LineApplication
{
   class Line
   {
      private double length;   // Longitud de la línea
      public Line(double len)  // Constructor parametrizado
      {
         Console.WriteLine("Objeto creado, length = {0}", len);
         length = len;
      }

      public void setLength( double len )
      {
         length = len;
      }
      public double getLength()
      {
         return length;
      }

      static void Main(string[] args)
      {
         Line line = new Line(10.0);
         Console.WriteLine("Longitud de la línea: {0}", line.getLength());
         // Establecer la longitud de la línea
         line.setLength(6.0);
         Console.WriteLine("Longitud de la línea: {0}", line.getLength());
         Console.ReadKey();
      }
   }
}

Cuando el código anterior se compila y ejecuta, produce el siguiente resultado:

对象已创建,length = 10
线条的长度: 10
线条的长度: 6

Destructores en C#

de la clasedestructores una función miembro especial de la clase que se ejecuta cuando un objeto de la clase queda fuera del alcance.

El nombre del destructor es el nombre de la clase precedido por una tilde (~), no devuelve ningún valor y no acepta ningún parámetro.

El destructor se utiliza para liberar recursos antes de finalizar el programa (como cerrar archivos, liberar memoria, etc.). El destructor no se puede heredar ni sobrecargar.

El siguiente ejemplo ilustra el concepto de destructor:

Ejemplo


using System;
namespace LineApplication
{
   class Line
   {
      private double length;   // Longitud de la línea
      public Line()  // Constructor
      {
         Console.WriteLine("Objeto creado");
      }
      ~Line() // Destructor
      {
         Console.WriteLine("Objeto eliminado");
      }

      public void setLength( double len )
      {
         length = len;
      }
      public double getLength()
      {
         return length;
      }

      static void Main(string[] args)
      {
         Line line = new Line();
         // Establecer la longitud de la línea
         line.setLength(6.0);
         Console.WriteLine("Longitud de la línea: {0}", line.getLength());          
      }
   }
}

Cuando el código anterior se compila y ejecuta, produce el siguiente resultado:

对象已创建
线条的长度: 6
对象已删除

Miembros estáticos de una clase en C#

la palabra clavestaticdefine los miembros de la clase como estáticos. Cuando declaramos un miembro de la clase como estático, significa que sin importar cuántos objetos de la clase se creen, solo habrá una copia de ese miembro estático.

la palabra clavestaticsignifica que solo hay una instancia de ese miembro en la clase. Las variables estáticas se utilizan para definir constantes, porque sus valores se pueden obtener llamando directamente a la clase sin necesidad de crear una instancia de la clase. Las variables estáticas se pueden inicializar fuera de la función miembro o de la definición de la clase. También puedes inicializar variables estáticas dentro de la definición de la clase.

El siguiente ejemplo demuestravariable estáticasu uso:

Ejemplo

using System;
namespace StaticVarApplication
{
    class StaticVar
    {
       public static int num;
        public void count()
        {
            num++;
        }
        public int getNum()
        {
            return num;
        }
    }
    class StaticTester
    {
        static void Main(string[] args)
        {
            StaticVar s1 = new StaticVar();
            StaticVar s2 = new StaticVar();
            s1.count();
            s1.count();
            s1.count();
            s2.count();
            s2.count();
            s2.count();        
            Console.WriteLine("La variable num de s1: {0}", s1.getNum());
            Console.WriteLine("La variable num de s2: {0}", s2.getNum());
            Console.ReadKey();
        }
    }
}

Cuando el código anterior se compila y ejecuta, produce el siguiente resultado:

s1 的变量 num: 6
s2 的变量 num: 6

También puedesfunción miembrodeclarar comostatic. Tal función solo puede acceder a variables estáticas. Las funciones estáticas existen antes de que se cree un objeto. El siguiente ejemplo demuestrafunción estáticasu uso:

Ejemplo

using System;
namespace StaticVarApplication
{
    class StaticVar
    {
       public static int num;
        public void count()
        {
            num++;
        }
        public static int getNum()
        {
            return num;
        }
    }
    class StaticTester
    {
        static void Main(string[] args)
        {
            StaticVar s = new StaticVar();
            s.count();
            s.count();
            s.count();                  
            Console.WriteLine("Variable num: {0}", StaticVar.getNum());
            Console.ReadKey();
        }
    }
}

Cuando el código anterior se compila y ejecuta, produce el siguiente resultado:

变量 num: 3
Otras extensiones