Propriedade C#

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 Personcom três campos privados firstName,, lastNamee 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 à Personclasse:

// 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 gete set. Os gete setsão chamados de acessadores de propriedade.

Quando você lê uma propriedade, o getacessador é executado. E quando você atribui um valor a uma propriedade, o setacessador é 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 Personclasse.
  • Segundo, atribua os valores às propriedades FirstNamee LastName.
  • Terceiro, leia os valores das propriedades FirstNamee LastName.

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 setacessadores 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 exceptionLinguagem de código:  C#  ( cs )

Saída:

Unhandled exception. System.ArgumentException: The age must be between 1 and 150Linguagem de código:  C#  ( cs )

Propriedade computada C#

Para criar uma propriedade computada, você pode implementar o getacessador. Por exemplo, você pode criar uma FullNamepropriedade 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 FullNamepropriedade:

// 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 DoeLinguagem de código:  C#  ( cs )

Se você tentar atribuir um valor à FullNamepropriedade, 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 onlyLinguagem de código:  C#  ( cs )

Propriedades autoimplementadas em C#

Se você tiver uma propriedade que não requer lógica adicional nos acessadores setou get, poderá usar uma propriedade implementada automaticamente.

O exemplo a seguir define a Skillclasse que possui dois campos privados namee ratinge 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 sete .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 Ratingpropriedade 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.

Deixe um comentário

O seu endereço de email não será publicado. Campos obrigatórios marcados com *