The access operators ., [], and ?. allow accessing members of classes, structures, and collections
Dot Operator (.)
The dot operator (.) is the most commonly used access operator in C#. It allows access to the members of a class or structure (including properties, methods, and fields)
For example, if we have this class,
public class Persona
{
public string Nombre { get; set; }
public void Saludar()
{
Console.WriteLine($"Hola, soy {Nombre}");
}
}We can use the dot operator . to access the property Nombre or the method Saludar().
Persona persona = new Persona();
persona.Nombre = "Carlos";
persona.Saludar(); // Output: Hola, soy CarlosIndex Operator ([])
The index operator ([]) is used to access elements of arrays and collections that implement an index.
Accessing elements of a collection
string[] nombres = { "Ana", "Luis", "Pedro" };
string nombre = nombres[1];
Console.WriteLine(nombre); // Output: LuisIn this case, the operator [] is used to:::explain
:::access the first element of the array numeros.
User-defined indexers
public class Libro
{
private string[] paginas = new string[100];
public string this[int indice]
{
get { return paginas[indice]; }
set { paginas[indice] = value; }
}
}
public class Ejemplo
{
public void Ejecutar()
{
Libro libro = new Libro();
libro[0] = "Primera página";
Console.WriteLine(libro[0]); // Output: Primera página
}
}In this example, the class Libro defines an indexer, allowing access to its pages using the operator [].
Conditional Access Operator (?.)
The conditional access operator (?.) makes safe handling of null values easier by allowing access to members only if the object is not null.
If the object is null, the expression simply returns null, without throwing a NullReferenceException
Persona persona = null;
string nombre = persona?.Nombre;
Console.WriteLine(nombre == null ? "Nombre es nulo" : nombre); // Output: Nombre es nuloIn this case, the operator ?. prevents an exception when trying to access the property Nombre of a persona object that is null.
The operator ?. can be chained to handle multiple levels of access.
Persona persona = new Persona();
string calle = persona?.Direccion?.Calle;
Console.WriteLine(calle == null ? "Calle es nulo" : calle); // Output: Calle es nuloHere, persona?.Direccion?.Calle checks each level for null before attempting to access Calle.
The conditional access operator is very useful. It saves a lot of lines of code and/or many problems when working with nullable types.