A 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
1234567891011using 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
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); } }
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
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; }
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
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 } }
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
1234static void Main() { // code }
1. Uma classe pode armazenar dados diretamente?
2. Qual é a sintaxe correta para modificar o campo value
?
Obrigado pelo seu feedback!
Pergunte à IA
Pergunte à IA
Pergunte o que quiser ou experimente uma das perguntas sugeridas para iniciar nosso bate-papo
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
A 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
1234567891011using 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
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); } }
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
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; }
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
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 } }
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
1234static void Main() { // code }
1. Uma classe pode armazenar dados diretamente?
2. Qual é a sintaxe correta para modificar o campo value
?
Obrigado pelo seu feedback!