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,4Definindo 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); // prodInicializadores 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 14Combinando 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); // adminValores 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); // 5Inicializaçã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); // 2Inicializaçã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); // 80Inicializaçã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); // 100Inicializadores 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 / OsloInicializaçã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 PenCombinando 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.9Verificaçã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
initpor 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
- Setters somente de init
- O modificador required
- Padrões de objetos imutáveis
- Expressões with em records