Operatory przypisania (odwołanie w C#)
Operator =
przypisania przypisuje wartość operandu po prawej stronie do zmiennej, właściwości lub elementu indeksatora podanego przez operand po lewej stronie. Wynikiem wyrażenia przypisania jest wartość przypisana do operandu po lewej stronie. Typ operandu po prawej stronie musi być taki sam jak typ operandu po lewej stronie lub niejawnie konwertowany.
Operator =
przypisania jest prawo asocjacyjny, czyli wyrażenie formularza
a = b = c
Jest oceniany jako
a = (b = c)
W poniższym przykładzie pokazano użycie operatora przypisania ze zmienną lokalną, właściwością i elementem indeksatora jako operand po lewej stronie:
List<double> numbers = [1.0, 2.0, 3.0];
Console.WriteLine(numbers.Capacity);
numbers.Capacity = 100;
Console.WriteLine(numbers.Capacity);
// Output:
// 4
// 100
int newFirstElement;
double originalFirstElement = numbers[0];
newFirstElement = 5;
numbers[0] = newFirstElement;
Console.WriteLine(originalFirstElement);
Console.WriteLine(numbers[0]);
// Output:
// 1
// 5
Lewy operand przypisania otrzymuje wartość operandu po prawej stronie. Gdy operandy są typami wartości, przypisanie kopiuje zawartość operandu po prawej stronie. Gdy operandy są typami referencyjnymi, przypisanie kopiuje odwołanie do obiektu.
Ta operacja jest nazywana przypisaniem wartości : wartość jest przypisana.
ref przypisania
Przypisanie= ref
ref sprawia, że lewy operand jest aliasem do operandu po prawej stronie, jak pokazano w poniższym przykładzie:
void Display(double[] s) => Console.WriteLine(string.Join(" ", s));
double[] arr = { 0.0, 0.0, 0.0 };
Display(arr);
ref double arrayElement = ref arr[0];
arrayElement = 3.0;
Display(arr);
arrayElement = ref arr[arr.Length - 1];
arrayElement = 5.0;
Display(arr);
// Output:
// 0 0 0
// 3 0 0
// 3 0 5
W poprzednim przykładzie lokalna zmienna arrayElement
referencyjna jest inicjowana jako alias pierwszego elementu tablicy. Następnie zostanie ref
ponownie przydzielony, aby odwołać się do ostatniego elementu tablicy. Ponieważ jest to alias, po zaktualizowaniu jej wartości za pomocą zwykłego operatora =
przypisania, odpowiedni element tablicy jest również aktualizowany.
Lewy operand ref
przypisania może być lokalną zmienną referencyjną, polemref
i parametrem ref
metody , out
lub in
. Oba operandy muszą być tego samego typu.
Przypisanie ref
oznacza, że zmienna referencyjna ma inny referent. Nie odnosi się już do swojego poprzedniego referenta. Użycie ref =
w parametrze ref
oznacza, że parametr nie odwołuje się już do jego argumentu. Wszelkie akcje, które modyfikują stan obiektu po ponownym przypisaniu jego referencji, wprowadzają te modyfikacje do nowego elementu. Rozważmy na przykład następującą metodę:
private static void RefReassignAndModify(scoped ref string s)
{
string sLocal = "Hello";
Console.WriteLine(sLocal); // Output: Hello
s = ref sLocal;
s = "World";
Console.WriteLine(s); // Output: World
Następujące użycie pokazuje, że przypisanie do parametru s
nie jest widoczne po wywołaniu metody, ponieważ s
został ref
przypisany ponownie, aby odwołać się do sLocal
przed zmodyfikowaniem ciągu.
string msg = "Hi";
RefReassignAndModify(ref msg);
Console.WriteLine(msg); // Output: Hi!
Przypisanie złożone
Dla operatora op
binarnego wyrażenie przypisania złożonego formularza
x op= y
Jest odpowiednikiem
x = x op y
Z tą różnicą, że x
jest obliczana tylko raz.
Operatory arytmetyczne arytmetyczne, logicznei bitowe operatory logiczne i przesunięcia obsługują przypisanie compount.
Przypisanie łączenia wartości null
Możesz użyć operatora ??=
przypisania łączenia wartości null, aby przypisać wartość operandu po prawej stronie do operandu po lewej stronie tylko wtedy, gdy operand po lewej stronie zwróci wartość .null
Aby uzyskać więcej informacji, zobacz ?? i ?? = artykuł operatorów .
Przeciążenie operatora
Typ zdefiniowany przez użytkownika nie może przeciążyć operatora przypisania. Jednak typ zdefiniowany przez użytkownika może definiować niejawną konwersję na inny typ. W ten sposób wartość typu zdefiniowanego przez użytkownika może być przypisana do zmiennej, właściwości lub elementu indeksatora innego typu. Aby uzyskać więcej informacji, zobacz Operatory konwersji zdefiniowane przez użytkownika.
Typ zdefiniowany przez użytkownika nie może jawnie przeciążyć operatora przypisania złożonego. Jeśli jednak typ zdefiniowany przez użytkownika przeciąża operator op
binarny , op=
operator, jeśli istnieje, jest również niejawnie przeciążony.
specyfikacja języka C#
Aby uzyskać więcej informacji, zobacz sekcję Operatory przypisania specyfikacji języka C#.