Como declarar e usar propriedades de leitura escrita (Guia de Programação em C#)
As propriedades oferecem a conveniência dos membros de dados públicos sem os riscos decorrentes do acesso desprotegido, não controlado e não verificado aos dados de um objeto. As propriedades declaram acessadores: métodos especiais que atribuem e recuperam valores do membro de dados subjacente. O acessador de conjunto permite que membros de dados sejam atribuídos e o acessador de obtenção recupera valores de membro de dados.
Este exemplo mostra uma Person
classe que tem duas propriedades: Name
(string) e Age
(int). Ambas as propriedades fornecem get
e set
acessam, portanto, são consideradas propriedades de leitura/gravação.
Exemplo
class Person
{
private string _name = "N/A";
private int _age = 0;
// Declare a Name property of type string:
public string Name
{
get
{
return _name;
}
set
{
_name = value;
}
}
// Declare an Age property of type int:
public int Age
{
get
{
return _age;
}
set
{
_age = value;
}
}
public override string ToString()
{
return "Name = " + Name + ", Age = " + Age;
}
}
public class Wrapper
{
private string _name = "N/A";
public string Name
{
get
{
return _name;
}
private set
{
_name = value;
}
}
}
class TestPerson
{
static void Main()
{
// Create a new Person object:
Person person = new Person();
// Print out the name and the age associated with the person:
Console.WriteLine("Person details - {0}", person);
// Set some values on the person object:
person.Name = "Joe";
person.Age = 99;
Console.WriteLine("Person details - {0}", person);
// Increment the Age property:
person.Age += 1;
Console.WriteLine("Person details - {0}", person);
// Keep the console window open in debug mode.
Console.WriteLine("Press any key to exit.");
Console.ReadKey();
}
}
/* Output:
Person details - Name = N/A, Age = 0
Person details - Name = Joe, Age = 99
Person details - Name = Joe, Age = 100
*/
Programação robusta
No exemplo anterior, as Name
propriedades e Age
são públicas e incluem um get
e um set
acessador. Os acessadores públicos permitem que qualquer objeto leia e grave essas propriedades. Às vezes é desejável, no entanto, excluir um dos acessadores. Você pode omitir o set
acessador para tornar a propriedade somente leitura:
public string Name
{
get
{
return _name;
}
private set
{
_name = value;
}
}
Como alternativa, você pode expor um acessador publicamente, mas tornar o outro privado ou protegido. Para obter mais informações, consulte Acessibilidade do acessador assimétrico.
Uma vez que as propriedades são declaradas, elas podem ser usadas como campos da classe. As propriedades permitem uma sintaxe natural ao obter e definir o valor de uma propriedade, como nas seguintes instruções:
person.Name = "Joe";
person.Age = 99;
Em um método de propriedade set
, uma variável especial value
está disponível. Esta variável contém o valor que o usuário especificou, por exemplo:
_name = value;
Observe a sintaxe limpa para incrementar a Age
propriedade em um Person
objeto:
person.Age += 1;
Se métodos separados set
e get
fossem usados para modelar propriedades, o código equivalente poderia ter esta aparência:
person.SetAge(person.GetAge() + 1);
O ToString
método é substituído neste exemplo:
public override string ToString()
{
return "Name = " + Name + ", Age = " + Age;
}
Observe que ToString
não é usado explicitamente no programa. É invocado WriteLine
por padrão pelas chamadas.