Operadores de acceso a miembros (referencia de C#)Member access operators (C# Reference)

Puede usar los siguientes operadores cuando tiene acceso a un miembro de tipo:You might use the following operators when you access a type member:

Operador de acceso a miembros.Member access operator .

Use el token . para acceder a un miembro de un espacio de nombres o un tipo, como se muestran en los ejemplos siguientes:You use the . token to access a member of a namespace or a type, as the following examples demonstrate:

  • Use . para acceder a un espacio de nombres anidado dentro de un espacio de nombres, como se muestra en el siguiente ejemplo de una directiva using:Use . to access a nested namespace within a namespace, as the following example of a using directive shows:

    using System.Collections.Generic;
    
  • Use . para formar un nombre completo para tener acceso a un tipo dentro de un espacio de nombres, como se muestra en el código siguiente:Use . to form a qualified name to access a type within a namespace, as the following code shows:

    System.Collections.Generic.IEnumerable<int> numbers = new int[] { 1, 2, 3 };
    

    Utilice una directiva using para hacer que el uso de nombres completos sea opcional.Use a using directive to make the use of qualified names optional.

  • Use . para tener acceso a los miembros de tipo, que no son estáticos y, como se muestra en el código siguiente:Use . to access type members, static and non-static, as the following code shows:

    var constants = new List<double>();
    constants.Add(Math.PI);
    constants.Add(Math.E);
    Console.WriteLine($"{constants.Count} values to show:");
    Console.WriteLine(string.Join(", ", constants));
    // Output:
    // 2 values to show:
    // 3.14159265358979, 2.71828182845905
    

También puede usar . para acceder a un método de extensión.You can also use . to access an extension method.

Operador del indizador []Indexer operator []

Los corchetes, [], se suelen usar para el acceso a matriz, indizador o elemento de puntero.Square brackets, [], are typically used for array, indexer, or pointer element access.

Acceso a matrizArray access

En el ejemplo siguiente se muestra cómo se obtiene acceso a los elementos de matriz:The following example demonstrates how to access array elements:

int[] fib = new int[10];
fib[0] = fib[1] = 1;
for (int i = 2; i < fib.Length; i++)
{
    fib[i] = fib[i - 1] + fib[i - 2];
}
Console.WriteLine(fib[fib.Length - 1]);  // output: 55

double[,] matrix = new double[2,2];
matrix[0,0] = 1.0;
matrix[0,1] = 2.0;
matrix[1,0] = matrix[1,1] = 3.0;
var determinant = matrix[0,0] * matrix[1,1] - matrix[1,0] * matrix[0,1];
Console.WriteLine(determinant);  // output: -3

Si un índice de matriz se encuentra fuera de los límites de la dimensión correspondiente de una matriz, se produce una excepción IndexOutOfRangeException.If an array index is outside the bounds of the corresponding dimension of an array, an IndexOutOfRangeException is thrown.

Tal como se muestra en el ejemplo anterior, también usa corchetes al declarar un tipo de matriz o crear instancias de matriz.As the preceding example shows, you also use square brackets when you declare an array type or instantiate an array instance.

Para obtener más información sobre las matrices, consulte Matrices.For more information about arrays, see Arrays.

Acceso a indizadorIndexer access

En el siguiente ejemplo se usa el tipo Dictionary<TKey,TValue> de .NET para mostrar el acceso a indizador:The following example uses .NET Dictionary<TKey,TValue> type to demonstrate indexer access:

var dict = new Dictionary<string, double>();
dict["one"] = 1;
dict["pi"] = Math.PI;
Console.WriteLine(dict["one"] + dict["pi"]);  // output: 4.14159265358979

Los indizadores le permiten indizar las instancias de un tipo definido por el usuario de un modo similar a la indización de matrices.Indexers allow you to index instances of a user-defined type in the similar way as array indexing. A diferencia de los índices de matriz, que deben ser enteros, los argumentos de indizador se pueden declarar para ser de cualquier tipo.Unlike array indices, which must be integer, the indexer arguments can be declared to be of any type.

Para más información sobre los indizadores, consulte Indizadores.For more information about indexers, see Indexers.

Otros usos de []Other usages of []

Para información sobre el acceso de los elementos de puntero, consulte la sección Operador de acceso de elemento de puntero del artículo Operadores relacionados con el puntero.For information about pointer element access, see the Pointer element access operator [] section of the Pointer related operators article.

También usa los corchetes para especificar atributos:You also use square brackets to specify attributes:

[System.Diagnostics.Conditional("DEBUG")]
void TraceMethod() {}

Operadores condicionales NULL ?.Null-conditional operators ?. y ?[]and ?[]

Disponible en C# 6 y versiones posteriores, un operador condicional NULL aplica una operación de acceso a miembros, ?., o acceso a elementos, ?[], a su operando solo si dicho operando se evalúa como no NULL.Available in C# 6 and later, a null-conditional operator applies a member access, ?., or element access, ?[], operation to its operand only if that operand evaluates to non-null. Si el operando se evalúa como null, el resultado de aplicar el operador es null.If the operand evaluates to null, the result of applying the operator is null. El operador de acceso de miembro condicional NULL ?. también se conoce con el nombre de operador Elvis.The null-conditional member access operator ?. is also known as the Elvis operator.

Los operadores de condición NULL se cortocircuitan.The null-conditional operators are short-circuiting. Es decir, si una operación en una cadena de la operación de acceso a elementos o miembros condicional devuelve null, no se ejecuta el resto de la cadena.That is, if one operation in a chain of conditional member or element access operations returns null, the rest of the chain doesn't execute. En el ejemplo siguiente, B no se evalúa si A se evalúa como null y C no se evalúa si A o B se evalúan como null:In the following example, B is not evaluated if A evaluates to null and C is not evaluated if A or B evaluates to null:

A?.B?.Do(C);
A?.B?[C];

En el siguiente ejemplo se muestra el uso de los operadores ?. y ?[]:The following example demonstrates the usage of the ?. and ?[] operators:

double SumNumbers(List<double[]> setsOfNumbers, int indexOfSetToSum)
{
    return setsOfNumbers?[indexOfSetToSum]?.Sum() ?? double.NaN;
}

var sum1 = SumNumbers(null, 0);
Console.WriteLine(sum1);  // output: NaN

var numberSets = new List<double[]>
{
    new[] { 1.0, 2.0, 3.0 },
    null
};

var sum2 = SumNumbers(numberSets, 0);
Console.WriteLine(sum2);  // output: 6

var sum3 = SumNumbers(numberSets, 1);
Console.WriteLine(sum3);  // output: NaN

El ejemplo anterior también muestra el uso del operador de uso combinado de NULL.The preceding example also shows the usage of the null-coalescing operator. Puede usar el operador de uso combinado de NULL para proporcionar una expresión alternativa a fin de evaluar en caso de que el resultado de la operación condicional NULL sea null.You might use the null-coalescing operator to provide an alternative expression to evaluate in case the result of the null-conditional operation is null.

Invocación de delegado seguro para subprocesosThread-safe delegate invocation

Use el operador ?. para comprobar si un delegado es distinto de NULL y se invoca de forma segura para subprocesos (por ejemplo, cuando se genera un evento), tal como se muestra en el código siguiente:Use the ?. operator to check if a delegate is non-null and invoke it in a thread-safe way (for example, when you raise an event), as the following code shows:

PropertyChanged?.Invoke(…)

Ese código es equivalente al código siguiente que se usaría en C# 5 o una versión anterior:That code is equivalent to the following code that you would use in C# 5 or earlier:

var handler = this.PropertyChanged;
if (handler != null)
{
    handler(…);
}

Operador de invocación ()Invocation operator ()

Utilice paréntesis, (), para llamar a un método o invocar un delegado.Use parentheses, (), to call a method or invoke a delegate.

En el ejemplo siguiente se muestra cómo llamar a un método, con o sin argumentos, y cómo invocar un delegado:The following example demonstrates how to call a method, with or without arguments, and invoke a delegate:

Action<int> display = s => Console.WriteLine(s);

var numbers = new List<int>();
numbers.Add(10);
numbers.Add(17);
display(numbers.Count);   // output: 2

numbers.Clear();
display(numbers.Count);   // output: 0

También usa paréntesis al invocar un constructor con un operador new.You also use parentheses when you invoke a constructor with a new operator.

Otros usos de ()Other usages of ()

También usa los paréntesis para especificar el orden en el que se van a evaluar operaciones en una expresión.You also use parentheses to specify the order in which to evaluate operations in an expression. Para más información, consulte la sección Agregar paréntesis del artículo Operadores.For more information, see the Adding parentheses section of the Operators article. Para ver la lista de operadores ordenados por nivel de precedencia, consulte Operadores de C#.For the list of operators ordered by precedence level, see C# operators.

Las expresiones de conversión, que invocan un operador de conversión, también usan el paréntesis.Cast expressions, which invoke a conversion operator, also use parentheses.

Posibilidad de sobrecarga del operadorOperator overloadability

Los operadores . y () no se pueden sobrecargar.The . and () operators cannot be overloaded. El operador [] también se considera un operador que no se puede sobrecargar.The [] operator is also considered a non-overloadable operator. Use indizadores para admitir la indización con tipos definidos por el usuario.Use indexers to support indexing with user-defined types.

Especificación del lenguaje C#C# language specification

Para más información, vea las secciones siguientes de la Especificación del lenguaje C#:For more information, see the following sections of the C# language specification:

Vea tambiénSee also