Say I have the following code:
static void Fjuk(out string str)
{
str = "fjuk!";
throw new Exception();
}
static void Main(string[] args)
{
string s = null;
try
{
Fjuk(out s);
}
catch (Exception)
{
Console.WriteLine(s ?? "");
}
}
When I test it, s has been initialized to “fjuk!” when it’s used in the catch block.
Is this guaranteed by specification or is it implementation dependent? (I have searched the C# 3 spec but couldn’t find out myself)
Pretty much, that is an aspect of what
outmeans; firstly, note thatoutdoesn’t really exist – we only really need to considerref(outis justrefwith some “definite assignment” tweaks at the compiler).refmeans “pass the address of this” – if we change the value via the address, then that shows immediately – it is, after all, updating the memory on the stack ofMain. It can’t abstract this (to delay the write) because the value could be, for example, some oversized struct that is usingrefspecifically for the purpose of avoiding copying it on the stack (an approach used extensively in XNA etc).