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
Can you explain more about the difference between static and non-static fields?
Why does the Main method have to be static in C#?
Can you give an example of when to use a static field or method?
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!