Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Aprende La Palabra Clave `static` | Fundamentos Esenciales de POO
C# Más Allá de lo Básico

bookLa 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

index.cs

copy
1234567891011
using 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

index.cs

copy
12345678910111213141516171819202122232425262728
using 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

index.cs

copy
12345678
public 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

index.cs

copy
123456789101112131415161718192021222324252627282930313233343536373839
using 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

index.cs

copy
1234
static void Main() { // code }

1. ¿Puede una clase almacenar datos directamente?

2. ¿Cuál es la sintaxis correcta para modificar el campo value?

question mark

¿Puede una clase almacenar datos directamente?

Select the correct answer

question mark

¿Cuál es la sintaxis correcta para modificar el campo value?

Select the correct answer

¿Todo estuvo claro?

¿Cómo podemos mejorarlo?

¡Gracias por tus comentarios!

Sección 4. Capítulo 5

Pregunte a AI

expand

Pregunte a AI

ChatGPT

Pregunte lo que quiera o pruebe una de las preguntas sugeridas para comenzar nuestra charla

Suggested prompts:

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

bookLa 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

index.cs

copy
1234567891011
using 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

index.cs

copy
12345678910111213141516171819202122232425262728
using 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

index.cs

copy
12345678
public 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

index.cs

copy
123456789101112131415161718192021222324252627282930313233343536373839
using 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

index.cs

copy
1234
static void Main() { // code }

1. ¿Puede una clase almacenar datos directamente?

2. ¿Cuál es la sintaxis correcta para modificar el campo value?

question mark

¿Puede una clase almacenar datos directamente?

Select the correct answer

question mark

¿Cuál es la sintaxis correcta para modificar el campo value?

Select the correct answer

¿Todo estuvo claro?

¿Cómo podemos mejorarlo?

¡Gracias por tus comentarios!

Sección 4. Capítulo 5
some-alt