Instance Constructors (C# Programming Guide)
Construtores de instância são usados para criar e inicializar variáveis de membro qualquer instância ao usar o nova a expressão para criar um objeto de um classe. Para inicializar um estático classe ou variáveis estáticas em uma classe non-static, você deve definir um construtor estático. Para obter mais informações, consulte Construtores estáticos (guia de programação de C#).
O exemplo a seguir mostra um construtor de instância:
class CoOrds
{
public int x, y;
// constructor
public CoOrds()
{
x = 0;
y = 0;
}
}
Observação |
---|
Para maior clareza, essa classe contém campos públicos. O uso de campos públicos não é uma prática recomendada de programação, porque ela permite que qualquer método em qualquer lugar em um programa irrestrito e sem a verificação de acesso para o funcionamento interno de um objeto. Membros de dados geralmente devem ser particulares e devem ser acessados apenas por meio de propriedades e métodos da classe. |
O construtor de instância é chamado sempre que um objeto se baseia o CoOrds classe é criada. Um construtor como esta, que leva sem argumentos, será chamado de um construtor padrão. No entanto, muitas vezes é útil fornecer construtores adicionais. Por exemplo, podemos adicionar um construtor para o CoOrds classe que nos permite especificar os valores iniciais para os membros de dados:
// tcA constructor with two arguments:
public CoOrds(int x, int y)
{
this.x = x;
this.y = y;
}
Isso permite que CoOrd objetos a serem criados com o padrão ou valores iniciais específicos, como este:
CoOrds p1 = new CoOrds();
CoOrds p2 = new CoOrds(5, 3);
Se uma classe não tem um construtor, um construtor padrão é gerado automaticamente e os valores padrão serão usados para inicializar os campos do objeto. Por exemplo, um int é inicializado para 0. Para obter mais informações sobre valores padrão, consulte Padrão Tabela de valores (C# referência). Portanto, porque o CoOrds construtor padrão da classe inicializa todos os membros de dados para zero, ele pode ser removido completamente sem alterar como funciona a classe. Um exemplo completo usando vários construtores é fornecido no exemplo 1, posteriormente neste tópico, e um exemplo de um construtor gerado automaticamente é fornecido no exemplo 2.
Construtores de instância também podem ser usados para chamar os construtores de instância de classes base. O construtor da classe pode chamar o construtor da classe base através do inicializador, da seguinte maneira:
class Circle : Shape
{
public Circle(double radius)
: base(radius, 0)
{
}
}
Neste exemplo, o Circle classe passa os valores que representam o radius e a altura para o construtor fornecido pelo Shape partir do qual Circle é derivada. Um exemplo completo usando Shape e Circle aparece nesse tópico como exemplo 3.
Exemplo 1
O exemplo a seguir demonstra uma classe com construtores de classe dois um sem argumentos e com dois argumentos.
class CoOrds
{
public int x, y;
// Default constructor:
public CoOrds()
{
x = 0;
y = 0;
}
// tcA constructor with two arguments:
public CoOrds(int x, int y)
{
this.x = x;
this.y = y;
}
// Override the ToString method:
public override string ToString()
{
return (String.Format("({0},{1})", x, y));
}
}
class MainClass
{
static void Main()
{
CoOrds p1 = new CoOrds();
CoOrds p2 = new CoOrds(5, 3);
// Display the results using the overriden ToString method:
Console.WriteLine("CoOrds #1 at {0}", p1);
Console.WriteLine("CoOrds #2 at {0}", p2);
Console.ReadKey();
}
}
/* Output:
CoOrds #1 at (0,0)
CoOrds #2 at (5,3)
*/
Exemplo 2
Neste exemplo, a classe Person não tem qualquer construtores, nesse caso, um construtor padrão é fornecido automaticamente e os campos são inicializados para seus valores padrão.
public class Person
{
public int age;
public string name;
}
class TestPerson
{
static void Main()
{
Person person = new Person();
Console.WriteLine("Name: {0}, Age: {1}", person.name, person.age);
// Keep the console window open in debug mode.
Console.WriteLine("Press any key to exit.");
Console.ReadKey();
}
}
// Output: Name: , Age: 0
Observe que o valor padrão de age é 0 e o valor padrão de name é null. Para obter mais informações sobre valores padrão, consulte Padrão Tabela de valores (C# referência).
Exemplo 3
O exemplo a seguir demonstra o uso de inicializador de classe base. O Circle classe é derivada da classe geral Shapee o Cylinder classe é derivada da Circle classe. O construtor de cada classe derivada está usando seu inicializador de classe base.
abstract class Shape
{
public const double pi = Math.PI;
protected double x, y;
public Shape(double x, double y)
{
this.x = x;
this.y = y;
}
public abstract double Area();
}
class Circle : Shape
{
public Circle(double radius)
: base(radius, 0)
{
}
public override double Area()
{
return pi * x * x;
}
}
class Cylinder : Circle
{
public Cylinder(double radius, double height)
: base(radius)
{
y = height;
}
public override double Area()
{
return (2 * base.Area()) + (2 * pi * x * y);
}
}
class TestShapes
{
static void Main()
{
double radius = 2.5;
double height = 3.0;
Circle ring = new Circle(radius);
Cylinder tube = new Cylinder(radius, height);
Console.WriteLine("Area of the circle = {0:F2}", ring.Area());
Console.WriteLine("Area of the cylinder = {0:F2}", tube.Area());
// Keep the console window open in debug mode.
Console.WriteLine("Press any key to exit.");
Console.ReadKey();
}
}
/* Output:
Area of the circle = 19.63
Area of the cylinder = 86.39
*/
Para obter mais exemplos sobre como chamar os construtores de classe base, consulte virtual (C# Reference), override (C# Reference), e base (C# Reference).
Consulte também
Referência
Classes e estruturas (guia de programação de C#)
Constructors (C# Programming Guide)
Destructors (C# Programming Guide)