Tilldelningsoperatorer (C#-referens)
Tilldelningsoperatorn =
tilldelar värdet för sin högra operand till en variabel, en egenskap eller ett indexerarelement som ges av dess vänstra operand. Resultatet av ett tilldelningsuttryck är det värde som tilldelats till den vänstra operanden. Typen av den högra operanden måste vara samma som typen av den vänstra operanden eller implicit konvertibel till den.
Tilldelningsoperatorn =
är rätt-associativ, det vill: ett uttryck för formuläret
a = b = c
Utvärderas som
a = (b = c)
I följande exempel visas användningen av tilldelningsoperatorn med en lokal variabel, en egenskap och ett indexerarelement som dess vänstra operand:
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
Den vänstra operanden för en tilldelning tar emot värdet för den högra operanden. När operanderna är av värdetyper kopierar tilldelningen innehållet i den högra operanden. När operanderna är av referenstyper kopierar tilldelningen referensen till objektet.
Den här åtgärden kallas värdetilldelning: värdet tilldelas.
referenstilldelning
Referenstilldelningen= ref
gör dess vänstra operand till ett alias till den högra operanden, vilket visas i följande exempel:
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
I föregående exempel initieras den lokala referensvariabelnarrayElement
som ett alias för det första matriselementet. Sedan tilldelas ref
den om för att referera till det sista matriselementet. Eftersom det är ett alias uppdateras även motsvarande matriselement när du uppdaterar dess värde med en vanlig tilldelningsoperator =
.
Den vänstra operanden för ref
tilldelning kan vara en lokal referensvariabel, ett ref
fält och en ref
parameter för , out
eller in
metod. Båda operanderna måste vara av samma typ.
En ref
tilldelning innebär att en referensvariabel har en annan referens. Den refererar inte längre till den tidigare referensen. Om du använder ref =
på en ref
-parameter innebär det att parametern inte längre refererar till argumentet. Alla åtgärder som ändrar objektets tillstånd efter omtilldelningen av objektet gör dessa ändringar i det nya objektet. Tänk till exempel på följande 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
Följande användning visar att tilldelningen till parametern s
inte visas efter metodanropet eftersom s
ref
omtilldelades för att referera till sLocal
innan strängen ändrades:
string msg = "Hi";
RefReassignAndModify(ref msg);
Console.WriteLine(msg); // Output: Hi!
Sammansatt tilldelning
För en binär operator op
, ett sammansatt tilldelningsuttryck för formuläret
x op= y
Motsvarar
x = x op y
Förutom att x
bara utvärderas en gång.
Den aritmetiska, boolesk logiskaoch bitvis logiska och skift operatorer stöder alla kompound-tilldelning.
Null-sammankopplingstilldelning
Du kan använda tilldelningsoperatorn ??=
null-coalescing för att tilldela värdet för dess högra operand till dess vänstra operande endast om den vänstra operand utvärderas till null
. Mer information finns i ?? och ?? = operatorartikel .
Överlagring av operator
En användardefinierad typ kan inte överbelasta tilldelningsoperatorn. En användardefinierad typ kan dock definiera en implicit konvertering till en annan typ. På så sätt kan värdet för en användardefinierad typ tilldelas till en variabel, en egenskap eller ett indexerarelement av en annan typ. Mer information finns i Användardefinierade konverteringsoperatorer.
En användardefinierad typ kan inte uttryckligen överbelasta en sammansatt tilldelningsoperator. Men om en användardefinierad typ överbelastar en binär operator, är operatorn op
, om den op=
finns, också implicit överbelastad.
Språkspecifikation för C#
Mer information finns i avsnittet Tilldelningsoperatorer i C#-språkspecifikationen.