Marc Gravell ve Jon Skeet tarafından verilen cevaplara ek olarak, nesnelerin ve diğer referans türlerinin iade edildiğinde benzer şekilde davrandıklarını, ancak bazı farklılıkların olduğunu not etmek önemlidir.
Döndürülen "Ne" ifadesi, basit türlerle aynı mantığı izler:
class Test {
public static Exception AnException() {
Exception ex = new Exception("Me");
try {
return ex;
} finally {
// Reference unchanged, Local variable changed
ex = new Exception("Not Me");
}
}
}
Yerel değişkene son blokta yeni bir referans atanmadan önce döndürülen referans zaten değerlendirilmiştir.
Yürütme esasen:
class Test {
public static Exception AnException() {
Exception ex = new Exception("Me");
Exception CS$1$0000 = null;
try {
CS$1$0000 = ex;
} finally {
// Reference unchanged, Local variable changed
ex = new Exception("Not Me");
}
return CS$1$0000;
}
}
Fark, dikkatli olmamanız durumunda beklenmedik davranışlara neden olabilecek nesnenin özelliklerini / yöntemlerini kullanarak değiştirilebilir türleri değiştirmenin mümkün olabilmesidir.
class Test2 {
public static System.IO.MemoryStream BadStream(byte[] buffer) {
System.IO.MemoryStream ms = new System.IO.MemoryStream(buffer);
try {
return ms;
} finally {
// Reference unchanged, Referenced Object changed
ms.Dispose();
}
}
}
Try-return-nihayetinde dikkate alınması gereken ikinci bir şey de, "referans ile" geçirilen parametrelerin, dönüşten sonra yine de değiştirilebilmesidir. Yalnızca dönüş değeri değerlendirildi ve döndürülmeyi bekleyen geçici bir değişkente saklandı, diğer değişkenler yine de normal şekilde değiştirildi. Bir out parametresinin sözleşmesi, nihayet bu şekilde engellenene kadar yerine getirilemez.
class ByRefTests {
public static int One(out int i) {
try {
i = 1;
return i;
} finally {
// Return value unchanged, Store new value referenced variable
i = 1000;
}
}
public static int Two(ref int i) {
try {
i = 2;
return i;
} finally {
// Return value unchanged, Store new value referenced variable
i = 2000;
}
}
public static int Three(out int i) {
try {
return 3;
} finally {
// This is not a compile error!
// Return value unchanged, Store new value referenced variable
i = 3000;
}
}
}
Diğer herhangi bir akış yapısı gibi "try-return-nihayet" yerine sahiptir ve gerçekte derlediği yapıyı yazmaktan daha temiz görünümlü kodlara izin verebilir . Ancak gotcha'lardan kaçınmak için dikkatle kullanılmalıdır.