Como implementar uma classe leve com propriedades autoimplementadas (Guia de Programação em C#)
Este exemplo mostra como criar uma classe imutável leve que serve apenas para encapsular um conjunto de propriedades de auto-implementado. Use esse tipo de construção em vez de uma struct quando for necessário usar semântica de tipo de referência.
Observe que, com propriedades de auto-implementada, tanto um obter e set acessador são necessários. Você tornar a classe imutável, declarando a set acessadores como particular. No entanto, quando você declara uma private set acessador, não é possível usar um inicializador de objeto para inicializar a propriedade. Você deve usar um construtor ou um método de fábrica.
Exemplo
O exemplo a seguir mostra duas maneiras de implementar uma classe imutável que tem propriedades auto-implementado. A primeira classe usa um construtor para inicializar as propriedades e a segunda classe usa um método de estática de fábrica.
// This class is immutable. After an object is created,
// it cannot be modified from outside the class. It uses a
// constructor to initialize its properties.
class Contact
{
// Read-only properties.
public string Name { get; private set; }
public string Address { get; private set; }
// Public constructor.
public Contact(string contactName, string contactAddress)
{
Name = contactName;
Address = contactAddress;
}
}
// This class is immutable. After an object is created,
// it cannot be modified from outside the class. It uses a
// static method and private constructor to initialize its properties.
public class Contact2
{
// Read-only properties.
public string Name { get; private set; }
public string Address { get; private set; }
// Private constructor.
private Contact2(string contactName, string contactAddress)
{
Name = contactName;
Address = contactAddress;
}
// Public factory method.
public static Contact2 CreateContact(string name, string address)
{
return new Contact2(name, address);
}
}
public class Program
{
static void Main()
{
// Some simple data sources.
string[] names = {"Terry Adams","Fadi Fakhouri", "Hanying Feng",
"Cesar Garcia", "Debra Garcia"};
string[] addresses = {"123 Main St.", "345 Cypress Ave.", "678 1st Ave",
"12 108th St.", "89 E. 42nd St."};
// Simple query to demonstrate object creation in select clause.
// Create Contact objects by using a constructor.
var query1 = from i in Enumerable.Range(0, 5)
select new Contact(names[i], addresses[i]);
// List elements cannot be modified by client code.
var list = query1.ToList();
foreach (var contact in list)
{
Console.WriteLine("{0}, {1}", contact.Name, contact.Address);
}
// Create Contact2 objects by using a static factory method.
var query2 = from i in Enumerable.Range(0, 5)
select Contact2.CreateContact(names[i], addresses[i]);
// Console output is identical to query1.
var list2 = query2.ToList();
// List elements cannot be modified by client code.
// CS0272:
// list2[0].Name = "Eugene Zabokritski";
// Keep the console open in debug mode.
Console.WriteLine("Press any key to exit.");
Console.ReadKey();
}
}
/* Output:
Terry Adams, 123 Main St.
Fadi Fakhouri, 345 Cypress Ave.
Hanying Feng, 678 1st Ave
Cesar Garcia, 12 108th St.
Debra Garcia, 89 E. 42nd St.
*/
O compilador cria campos de apoio para cada propriedade auto-implementado. Os campos não são acessíveis diretamente a partir do código-fonte.
Consulte também
Referência
Propriedades (Guia de Programação em C#)
Inicializadores de objeto e coleção (Guia de Programação em C#)