Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Aprenda A Palavra-Chave `static` | Essenciais de Poo
C# Além do Básico

bookA Palavra-Chave `static`

Uma palavra-chave importante que você provavelmente já encontrou muitas vezes é a palavra-chave static. No Curso de Fundamentos de C#, foi mencionado que static é usado ao definir variáveis globais - variáveis que estão fora de qualquer 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}"); } }

Naquele momento, foi uma forma conveniente de descrever a palavra-chave static, pois era esperado que o leitor ainda não tivesse conhecimento sobre objetos ou classes. No entanto, agora, ao observar o código, você pode perceber que val é basicamente um campo da classe ConsoleApp. Porém, note que a classe ConsoleApp é um pouco diferente das classes que você normalmente cria. Isso ocorre porque ConsoleApp representa o próprio programa, e não existe nenhum objeto da classe ConsoleApp. Você irá retomar essa parte em breve.

Como uma classe é apenas um modelo, mais como uma estrutura vazia, ela normalmente não contém dados por si só; em vez disso, você cria objetos usando esse modelo e então armazena e acessa dados a partir desses objetos - como explicado 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); } }

Mesmo dentro de uma classe, ao acessar esses campos, o acesso ocorre por meio de um objeto. Por exemplo, em um construtor, basicamente são utilizados os dados passados pelo objeto que chamou o método construtor:

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

Da mesma forma, em outros métodos também, ao acessar campos, você está basicamente acessando os campos dos objetos que chamam esses métodos, e não da própria classe, pois a classe normalmente não contém nenhum dado.

No entanto, existe uma maneira de armazenar dados diretamente em uma classe e tornar uma propriedade acessível sem a necessidade de criar um objeto. Isso pode ser feito simplesmente tornando esse campo ou método 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 } }

Como a ConsoleApp ou a classe principal de qualquer programa, que representa o próprio programa, não pode ter objetos, é necessário tornar seus métodos e campos estáticos. Por isso, o método Main também é static:

index.cs

index.cs

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

1. Uma classe pode armazenar dados diretamente?

2. Qual é a sintaxe correta para modificar o campo value?

question mark

Uma classe pode armazenar dados diretamente?

Select the correct answer

question mark

Qual é a sintaxe correta para modificar o campo value?

Select the correct answer

Tudo estava claro?

Como podemos melhorá-lo?

Obrigado pelo seu feedback!

Seção 4. Capítulo 5

Pergunte à IA

expand

Pergunte à IA

ChatGPT

Pergunte o que quiser ou experimente uma das perguntas sugeridas para iniciar nosso bate-papo

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

bookA Palavra-Chave `static`

Deslize para mostrar o menu

Uma palavra-chave importante que você provavelmente já encontrou muitas vezes é a palavra-chave static. No Curso de Fundamentos de C#, foi mencionado que static é usado ao definir variáveis globais - variáveis que estão fora de qualquer 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}"); } }

Naquele momento, foi uma forma conveniente de descrever a palavra-chave static, pois era esperado que o leitor ainda não tivesse conhecimento sobre objetos ou classes. No entanto, agora, ao observar o código, você pode perceber que val é basicamente um campo da classe ConsoleApp. Porém, note que a classe ConsoleApp é um pouco diferente das classes que você normalmente cria. Isso ocorre porque ConsoleApp representa o próprio programa, e não existe nenhum objeto da classe ConsoleApp. Você irá retomar essa parte em breve.

Como uma classe é apenas um modelo, mais como uma estrutura vazia, ela normalmente não contém dados por si só; em vez disso, você cria objetos usando esse modelo e então armazena e acessa dados a partir desses objetos - como explicado 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); } }

Mesmo dentro de uma classe, ao acessar esses campos, o acesso ocorre por meio de um objeto. Por exemplo, em um construtor, basicamente são utilizados os dados passados pelo objeto que chamou o método construtor:

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

Da mesma forma, em outros métodos também, ao acessar campos, você está basicamente acessando os campos dos objetos que chamam esses métodos, e não da própria classe, pois a classe normalmente não contém nenhum dado.

No entanto, existe uma maneira de armazenar dados diretamente em uma classe e tornar uma propriedade acessível sem a necessidade de criar um objeto. Isso pode ser feito simplesmente tornando esse campo ou método 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 } }

Como a ConsoleApp ou a classe principal de qualquer programa, que representa o próprio programa, não pode ter objetos, é necessário tornar seus métodos e campos estáticos. Por isso, o método Main também é static:

index.cs

index.cs

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

1. Uma classe pode armazenar dados diretamente?

2. Qual é a sintaxe correta para modificar o campo value?

question mark

Uma classe pode armazenar dados diretamente?

Select the correct answer

question mark

Qual é a sintaxe correta para modificar o campo value?

Select the correct answer

Tudo estava claro?

Como podemos melhorá-lo?

Obrigado pelo seu feedback!

Seção 4. Capítulo 5
some-alt