La Palabra Clave `static`
Una palabra clave importante que probablemente ya hayas encontrado muchas veces es la palabra clave static. En el Curso de Fundamentos de C#, se mencionó que static se utiliza al definir variables globales: variables que están fuera de cualquier método específico:
index.cs
1234567891011using System; class ConsoleApp { static int val = 10; static void Main() { Console.WriteLine($"The value is {val}"); } }
En ese momento, fue una forma conveniente de describir la palabra clave static porque se esperaba que el lector no tuviera conocimientos sobre objetos o clases, sin embargo, ahora si observas el código, puedes darte cuenta de que val es básicamente un campo de la clase ConsoleApp. Sin embargo, ten en cuenta que la clase ConsoleApp es ligeramente diferente de las clases que normalmente creas. Esto se debe a que ConsoleApp representa el propio programa y no existe ningún objeto de la clase ConsoleApp. Volverás a este punto más adelante.
Dado que una clase es solo un plano, más como una estructura vacía, normalmente no contiene datos por sí misma; en cambio, creas objetos usando ese plano y luego almacenas y accedes a los datos desde esos objetos, como se explicó anteriormente:
index.cs
12345678910111213141516171819202122232425262728using System; class Complex { public int real; public int img; public Complex(int real, int img) { this.real = real; this.img = img; } } class ConsoleApp { static int val = 10; static void Main() { Complex c = new Complex(5, 10); // We can use and update the field of 'c' which is an instance. Console.WriteLine(c.real); c.real = 7; Console.WriteLine(c.real); } }
Incluso dentro de una clase, al acceder a esos campos, lo haces a través de un objeto. Por ejemplo, en un constructor, básicamente utilizas los datos que fueron proporcionados por el objeto que llamó al método constructor:
index.cs
12345678public Complex(int real, int img) { // 'int real' and 'int img' contain the data which was passed // 'this.real' refers to the 'real' field of the object which is calling this constructor // same is the case for 'this.img' this.real = real; this.img = img; }
De manera similar, en otros métodos también, cuando accedes a campos, básicamente estás accediendo a los campos de los objetos que llaman a esos métodos, y no de la clase en sí, porque normalmente la clase no contiene ningún dato.
Sin embargo, existe una forma de almacenar datos directamente en una clase y hacer que una propiedad sea accesible sin necesidad de crear un objeto. Puedes lograrlo simplemente haciendo que ese campo o método sea static:
index.cs
123456789101112131415161718192021222324252627282930313233343536373839using System; class Complex { public int real; public int img; // A static field can contain data // It is set to private because we don't want it to be manually modifiable from outside // This will track the total number of 'Complex' objects created private static int numbers = 0; public Complex(int real, int img) { this.real = real; this.img = img; numbers += 1; } // A static method // A static method or field can be accessed using the 'ClassName.PropertyName' syntax (see below) public static int getTotalComplexNumbers() { return numbers; } } class ConsoleApp { static void Main() { Console.WriteLine(Complex.getTotalComplexNumbers()); // 0 new Complex(1, 2); Console.WriteLine(Complex.getTotalComplexNumbers()); // 1 new Complex(2, 3); Console.WriteLine(Complex.getTotalComplexNumbers()); // 2 } }
Dado que la ConsoleApp o la clase principal de cualquier programa que representa el propio programa no puede tener objetos, es necesario que sus métodos y campos sean estáticos. Por esta razón, el método Main también es static:
index.cs
1234static void Main() { // code }
1. ¿Puede una clase almacenar datos directamente?
2. ¿Cuál es la sintaxis correcta para modificar el campo value?
¡Gracias por tus comentarios!
Pregunte a AI
Pregunte a AI
Pregunte lo que quiera o pruebe una de las preguntas sugeridas para comenzar nuestra charla
Awesome!
Completion rate improved to 2.04
La Palabra Clave `static`
Desliza para mostrar el menú
Una palabra clave importante que probablemente ya hayas encontrado muchas veces es la palabra clave static. En el Curso de Fundamentos de C#, se mencionó que static se utiliza al definir variables globales: variables que están fuera de cualquier método específico:
index.cs
1234567891011using System; class ConsoleApp { static int val = 10; static void Main() { Console.WriteLine($"The value is {val}"); } }
En ese momento, fue una forma conveniente de describir la palabra clave static porque se esperaba que el lector no tuviera conocimientos sobre objetos o clases, sin embargo, ahora si observas el código, puedes darte cuenta de que val es básicamente un campo de la clase ConsoleApp. Sin embargo, ten en cuenta que la clase ConsoleApp es ligeramente diferente de las clases que normalmente creas. Esto se debe a que ConsoleApp representa el propio programa y no existe ningún objeto de la clase ConsoleApp. Volverás a este punto más adelante.
Dado que una clase es solo un plano, más como una estructura vacía, normalmente no contiene datos por sí misma; en cambio, creas objetos usando ese plano y luego almacenas y accedes a los datos desde esos objetos, como se explicó anteriormente:
index.cs
12345678910111213141516171819202122232425262728using System; class Complex { public int real; public int img; public Complex(int real, int img) { this.real = real; this.img = img; } } class ConsoleApp { static int val = 10; static void Main() { Complex c = new Complex(5, 10); // We can use and update the field of 'c' which is an instance. Console.WriteLine(c.real); c.real = 7; Console.WriteLine(c.real); } }
Incluso dentro de una clase, al acceder a esos campos, lo haces a través de un objeto. Por ejemplo, en un constructor, básicamente utilizas los datos que fueron proporcionados por el objeto que llamó al método constructor:
index.cs
12345678public Complex(int real, int img) { // 'int real' and 'int img' contain the data which was passed // 'this.real' refers to the 'real' field of the object which is calling this constructor // same is the case for 'this.img' this.real = real; this.img = img; }
De manera similar, en otros métodos también, cuando accedes a campos, básicamente estás accediendo a los campos de los objetos que llaman a esos métodos, y no de la clase en sí, porque normalmente la clase no contiene ningún dato.
Sin embargo, existe una forma de almacenar datos directamente en una clase y hacer que una propiedad sea accesible sin necesidad de crear un objeto. Puedes lograrlo simplemente haciendo que ese campo o método sea static:
index.cs
123456789101112131415161718192021222324252627282930313233343536373839using System; class Complex { public int real; public int img; // A static field can contain data // It is set to private because we don't want it to be manually modifiable from outside // This will track the total number of 'Complex' objects created private static int numbers = 0; public Complex(int real, int img) { this.real = real; this.img = img; numbers += 1; } // A static method // A static method or field can be accessed using the 'ClassName.PropertyName' syntax (see below) public static int getTotalComplexNumbers() { return numbers; } } class ConsoleApp { static void Main() { Console.WriteLine(Complex.getTotalComplexNumbers()); // 0 new Complex(1, 2); Console.WriteLine(Complex.getTotalComplexNumbers()); // 1 new Complex(2, 3); Console.WriteLine(Complex.getTotalComplexNumbers()); // 2 } }
Dado que la ConsoleApp o la clase principal de cualquier programa que representa el propio programa no puede tener objetos, es necesario que sus métodos y campos sean estáticos. Por esta razón, el método Main también es static:
index.cs
1234static void Main() { // code }
1. ¿Puede una clase almacenar datos directamente?
2. ¿Cuál es la sintaxis correcta para modificar el campo value?
¡Gracias por tus comentarios!