0Pricing
C# Academy · Aula

Setters somente de init

Crie propriedades que só podem ser definidas na inicialização.

Setters somente de init é uma aula grátis de C# Academy no CoddyKit. Esta é a aula 1 de 4. Você pode ler a aula completa abaixo gratuitamente — depois pratica ao vivo no navegador com um editor de código integrado e um tutor de IA 24/7. Faz parte do caminho de aprendizado de C# Academy, e seu progresso é sincronizado entre a web e o app CoddyKit. O curso de C# Academy inclui 4 aulas no total.

Acessadores somente de inicialização

Um acessador init permite definir uma propriedade durante a construção do objeto, inclusive em inicializadores de objeto, mas torna a propriedade somente de leitura depois disso. O formato é { get; init; }.

using System;

class Point {
    public int X { get; init; }
    public int Y { get; init; }
}

var p = new Point { X = 3, Y = 4 };
Console.WriteLine(p.X + "," + p.Y); // 3,4

Definindo apenas durante a inicialização

Depois que o objeto é criado, atribuir a uma propriedade init gera um erro de compilação, garantindo a imutabilidade após a construção.

using System;

class Config {
    public string Name { get; init; }
}

var c = new Config { Name = "prod" };
// c.Name = "dev"; // compile error
Console.WriteLine(c.Name); // prod

Inicializadores de objeto continuam funcionando

A grande vantagem em relação a uma propriedade somente de leitura é que init aceita a sintaxe de inicializador de objeto; assim, você não precisa de um construtor para cada propriedade.

using System;

class Settings {
    public bool DarkMode { get; init; }
    public int FontSize { get; init; }
}

var s = new Settings { DarkMode = true, FontSize = 14 };
Console.WriteLine(s.DarkMode + " " + s.FontSize); // True 14

Combinando com construtores

Você pode definir propriedades init em um construtor e também permitir que sejam substituídas por inicializadores.

using System;

class User {
    public string Role { get; init; } = "guest";
    public User() { }
}

var u = new User { Role = "admin" };
Console.WriteLine(u.Role); // admin

Valores padrão

As propriedades init podem ter inicializadores padrão, que serão aplicados quando não forem substituídas durante a construção.

using System;

class Options {
    public int Retries { get; init; } = 3;
}

Console.WriteLine(new Options().Retries);            // 3
Console.WriteLine(new Options { Retries = 5 }.Retries); // 5

Inicialização versus atribuição

Um acessador set permite alterações a qualquer momento; init restringe a atribuição à fase de construção. Escolha init para dados imutáveis após a criação.

using System;

class Mutable { public int V { get; set; } }
class Frozen  { public int V { get; init; } }

var m = new Mutable { V = 1 };
m.V = 2; // allowed
Console.WriteLine(m.V); // 2

Inicialização com validação

Você pode implementar um corpo explícito de init com um campo de armazenamento para validar o valor atribuído.

using System;

class Percentage {
    private int _value;
    public int Value {
        get => _value;
        init => _value = (value < 0 || value > 100)
            ? throw new ArgumentOutOfRangeException()
            : value;
    }
}

Console.WriteLine(new Percentage { Value = 80 }.Value); // 80

Inicialização em registros

As propriedades de registros posicionais são somente de init por padrão; por isso, os registros são imutáveis e ainda aceitam cópias com with.

using System;

record Account(string Id, decimal Balance);

var a = new Account("A1", 100m);
Console.WriteLine(a.Balance); // 100

Inicializadores de objeto aninhados

init funciona com inicializadores de objeto aninhados, permitindo criar grafos imutáveis complexos em uma única expressão.

using System;

class Address { public string City { get; init; } }
class Person { public string Name { get; init; } public Address Home { get; init; } }

var p = new Person { Name = "Lin", Home = new Address { City = "Oslo" } };
Console.WriteLine(p.Name + " / " + p.Home.City); // Lin / Oslo

Inicialização e herança

As classes derivadas podem definir propriedades init da classe base por meio de inicializadores de objeto, pois a fase de construção abrange o objeto inteiro.

using System;

class Base { public int Id { get; init; } }
class Item : Base { public string Name { get; init; } }

var i = new Item { Id = 1, Name = "Pen" };
Console.WriteLine(i.Id + " " + i.Name); // 1 Pen

Combinando tudo

Um objeto de transferência de dados imutável criado inteiramente com propriedades init e um inicializador de objeto.

using System;

class OrderDto {
    public int Id { get; init; }
    public string Customer { get; init; }
    public decimal Amount { get; init; }
}

var o = new OrderDto { Id = 7, Customer = "Ada", Amount = 49.9m };
Console.WriteLine(o.Id + " " + o.Customer + " " + o.Amount); // 7 Ada 49.9

Verificação rápida

Teste sua compreensão dos acessadores somente de inicialização.

Recapitulação

Você aprendeu sobre acessadores somente de inicialização.

  • { get; init; } permite atribuições apenas durante a construção.
  • Os inicializadores de objeto funcionam com propriedades init.
  • Você pode adicionar validação por meio de um corpo explícito de init.
  • As propriedades posicionais de registros usam init por padrão.

Perguntas Frequentes

A aula “Setters somente de init” é grátis?

Sim — o texto completo de “Setters somente de init” é grátis para ler aqui na web. Para praticá-la interativamente (um editor de código integrado e um tutor de IA 24/7) e desbloquear o restante do curso de C# Academy, atualize para CoddyKit PRO. O curso de C# Academy inclui 4 aulas no total.

O que vou aprender em “Setters somente de init”?

Crie propriedades que só podem ser definidas na inicialização. Você pratica C# Academy com código prático que executa diretamente no navegador, e um tutor de IA 24/7 responde suas dúvidas enquanto trabalha na aula.

Preciso ter experiência prévia para começar C# Academy?

Nenhuma experiência prévia é necessária. C# Academy no CoddyKit é estruturado para alunos iniciantes até avançados, então você pode começar aqui ou desde o início e aprender no seu ritmo. Esta é a aula 1 de 4.

Quanto tempo leva a aula “Setters somente de init”?

A maioria das aulas CoddyKit leva cerca de 5–10 minutos. Cada uma é compacta e interativa, então você faz progresso constante e retoma exatamente de onde parou entre web e app.

Posso escrever e executar código nesta aula de C# Academy?

Sim. Cada aula de C# Academy inclui um editor de código integrado, então você escreve e executa código real direto no navegador e recebe feedback de IA instantaneamente — nenhuma configuração local necessária.

Todas as aulas deste curso

  1. Setters somente de init
  2. O modificador required
  3. Padrões de objetos imutáveis
  4. Expressões with em records
← Voltar para C# Academy