Uwaga
Dostęp do tej strony wymaga autoryzacji. Może spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
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.
Począwszy od C# 14, lewa strona przypisania wartości może zawierać wyrażenie członka warunkowego null, takie jak ?.
lub ?[]
. Jeśli lewa strona ma wartość null, wyrażenie po prawej stronie nie jest oceniane.
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.
Arytmetyczne, logiczne Boole'a oraz operatorzy logiczni i przesunięcia bitowego obsługują przypisanie złożone.
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 artykuł ??
i ??=
operatory.
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.
Jeśli typ zdefiniowany przez użytkownika przeciąża operator binarny op
, to operator op=
, jeśli istnieje, jest również niejawnie przeciążony. Począwszy od języka C# 14, typ zdefiniowany przez użytkownika może jawnie przeciążać operatory przypisania złożonego (op=
), aby zapewnić wydajniejszą implementację. Zazwyczaj typ przeciąża te operatory, ponieważ wartość można zaktualizować bezpośrednio, zamiast przydzielać nowe wystąpienie do przechowywania wyniku operacji binarnej. Jeśli typ nie zapewnia jawnego przeciążenia, kompilator generuje niejawne przeciążenie.
specyfikacja języka C#
Aby uzyskać więcej informacji, zobacz sekcję Operatory przypisaniaspecyfikacji języka C# i specyfikację funkcji przypisania złożonego zdefiniowane przez użytkownika .