Resumo : neste tutorial, você falará sobre a propriedade C# e como usá-la de maneira eficaz.
Introdução à propriedade C#
Por definição, uma propriedade é membro de uma classe que fornece uma maneira flexível de ler, escrever ou calcular o valor de um campo privado.
Por exemplo, o seguinte define a classe Person
com três campos privados firstName
,, lastName
e age
:
// Person.cs
class Person
{
private string firstName;
private string lastName;
private int age;
}
Linguagem de código: C# ( cs )
Para atribuir valores e ler valores desses campos privados, você usa propriedades. Veja a seguir como adicionar três propriedades à Person
classe:
// Person.cs
class Person
{
private string firstName;
private string lastName;
private int age;
public string FirstName
{
get { return firstName; }
set { firstName = value; }
}
public string LastName
{
get { return lastName; }
set { lastName = value; }
}
public int Age
{
get { return age; }
set { age = value; }
}
}
Linguagem de código: C# ( cs )
Neste exemplo, declaramos uma propriedade como um campo com blocos get
e set
. Os get
e set
são chamados de acessadores de propriedade.
Quando você lê uma propriedade, o get
acessador é executado. E quando você atribui um valor a uma propriedade, o set
acessador é executado. Por exemplo:
// Program.cs
var p1 = new Person();
p1.FirstName = "John";
p1.LastName = "Doe";
Console.WriteLine($"{p1.FirstName} {p1.LastName}");
Linguagem de código: C# ( cs )
Neste exemplo:
- Primeiro, crie uma instância da
Person
classe. - Segundo, atribua os valores às propriedades
FirstName
eLastName
. - Terceiro, leia os valores das propriedades
FirstName
eLastName
.
Usando propriedade C# para validação de dados
Como uma propriedade fornece um local central para atribuir um valor a um campo privado, você pode validar os dados e lançar uma exceção se os dados não forem válidos.
Suponha que você queira implementar as seguintes regras de validação:
- O nome e o sobrenome não são nulos ou vazios
- A idade é entre 1 e 150
Para fazer isso, você pode adicionar a lógica de validação aos set
acessadores das propriedades conforme mostrado no exemplo a seguir:
// Person.cs
class Person
{
private string firstName;
private string lastName;
private int age;
public string FirstName
{
get
{
return firstName;
}
set
{
if (string.IsNullOrEmpty(value))
{
throw new ArgumentException("The first name must not be empty or null");
}
firstName = value;
}
}
public string LastName
{
get
{
return lastName;
}
set
{
if (string.IsNullOrEmpty(value))
{
throw new ArgumentException("The last name must not be empty or null");
}
lastName = value;
}
}
public int Age
{
get
{
return age;
}
set
{
if (value < 0 || value > 150)
{
throw new ArgumentException("The age must be between 1 and 150");
}
age = value;
}
}
}
Linguagem de código: C# ( cs )
O programa a seguir causa uma exceção porque a idade está fora do intervalo válido (1-150)
// Program.cs
var p1 = new Person();
p1.FirstName = "John";
p1.LastName = "Doe";
p1.Age = 200; // cause an exception
Linguagem de código: C# ( cs )
Saída:
Unhandled exception. System.ArgumentException: The age must be between 1 and 150
Linguagem de código: C# ( cs )
Propriedade computada C#
Para criar uma propriedade computada, você pode implementar o get
acessador. Por exemplo, você pode criar uma FullName
propriedade que retorne a concatenação do nome e do sobrenome:
// Person.cs
class Person
{
private string firstName;
private string lastName;
private int age;
public string FirstName
{
get
{
return firstName;
}
set
{
if (string.IsNullOrEmpty(value))
{
throw new ArgumentException("The first name must not be empty or null");
}
firstName = value;
}
}
public string LastName
{
get
{
return lastName;
}
set
{
if (string.IsNullOrEmpty(value))
{
throw new ArgumentException("The last name must not be empty or null");
}
lastName = value;
}
}
public int Age
{
get
{
return age;
}
set
{
if (value < 0 || value > 150)
{
throw new ArgumentException("The age must be between 1 and 150");
}
age = value;
}
}
public string FullName
{
get
{
return $"{FirstName} {LastName}";
}
}
}
Linguagem de código: C# ( cs )
E você pode ler na FullName
propriedade:
// Program.cs
var p1 = new Person();
p1.FirstName = "Jane";
p1.LastName = "Doe";
p1.Age = 25;
Console.WriteLine(p1.FullName);
Linguagem de código: C# ( cs )
Saída:
Jane Doe
Linguagem de código: C# ( cs )
Se você tentar atribuir um valor à FullName
propriedade, receberá um erro de compilação. Por exemplo:
// Program.cs
var p1 = new Person();
p1.FirstName = "Jane";
p1.LastName = "Doe";
p1.Age = 25;
Console.WriteLine(p1.FullName);
p1.FullName = "Jane Smith";
Linguagem de código: C# ( cs )
Erro:
Property or indexer 'Person.FullName' cannot be assigned to -- it is read only
Linguagem de código: C# ( cs )
Propriedades autoimplementadas em C#
Se você tiver uma propriedade que não requer lógica adicional nos acessadores set
ou get
, poderá usar uma propriedade implementada automaticamente.
O exemplo a seguir define a Skill
classe que possui dois campos privados name
e rating
e as propriedades correspondentes:
class Skill
{
private string name;
private sbyte rating;
public string Name
{
get { return name; }
set { name = value; }
}
public sbyte Rating
{
get { return rating; }
set { rating = value; }
}
}
Linguagem de código: C# ( cs )
Como os acessadores das propriedades não possuem lógica adicional além de ler e gravar em campos privados, você pode usar propriedades implementadas automaticamente como esta:
class Skill
{
public string Name { get; set; }
public sbyte Rating { get; set; }
}
Linguagem de código: C# ( cs )
Quando o compilador C# encontra uma propriedade implementada automaticamente, ele cria um campo privado e anônimo que pode ser acessado por meio dos acessadores set
e .get
Como você pode ver, as propriedades implementadas automaticamente tornam o código mais conciso neste caso.
No C# 9 ou posterior, você pode iniciar uma propriedade implementada automaticamente como esta:
class Skill
{
public string Name { get; set; }
public sbyte Rating { get; set; } = 1;
}
Linguagem de código: C# ( cs )
Neste exemplo, inicializamos a Rating
propriedade para que seu valor seja um quando você cria uma nova instância da classe Skill.
Resumo
- Uma propriedade é membro de uma classe que fornece uma maneira flexível de ler, gravar ou calcular o valor de um campo privado.
- Uma propriedade contém acessadores get e/ou set.
- O acessador get é executado quando você lê o valor da propriedade, enquanto o acessador set é executado quando você atribui um valor à propriedade.
- Use a propriedade implementada automaticamente se os acessadores get e set não tiverem lógica adicional para tornar o código mais conciso.