Saya melihat beberapa contoh kode C #, dan memperhatikan bahwa satu contoh membungkus return in ().
Saya selalu baru saja selesai:
return myRV;
Apakah ada perbedaan melakukan:
return (myRV);
Jawaban:
PEMBARUAN: Pertanyaan ini adalah subjek blog saya pada 12 April 2010 . Terima kasih atas pertanyaannya yang lucu!
Dalam prakteknya tidak ada perbedaan.
Secara teori mungkin ada perbedaan. Ada tiga poin menarik dalam spesifikasi C # yang bisa menghadirkan perbedaan.
Pertama, konversi fungsi anonim menjadi tipe delegasi dan pohon ekspresi. Pertimbangkan yang berikut ini:
Func<int> F1() { return ()=>1; }
Func<int> F2() { return (()=>1); }
F1
jelas legal. Apakah F2
? Secara teknis, tidak. Spesifikasi mengatakan di bagian 6.5 bahwa ada konversi dari ekspresi lambda ke tipe delegasi yang kompatibel. Apakah itu ekspresi lambda ? Tidak. Ini adalah ekspresi dalam tanda kurung yang berisi ekspresi lambda .
Kompiler Visual C # membuat pelanggaran spesifikasi kecil di sini dan membuang tanda kurung untuk Anda.
Kedua:
int M() { return 1; }
Func<int> F3() { return M; }
Func<int> F4() { return (M); }
F3
adalah legal. Apakah F4
? Tidak. Bagian 7.5.3 menyatakan bahwa ekspresi dalam tanda kurung tidak boleh berisi grup metode. Sekali lagi, demi kenyamanan Anda, kami melanggar spesifikasi dan mengizinkan konversi.
Ketiga:
enum E { None }
E F5() { return 0; }
E F6() { return (0); }
F5
adalah legal. Apakah F6
? Tidak. Spesifikasi menyatakan bahwa ada konversi dari nol literal ke jenis yang disebutkan. " (0)
" bukan nol literal, ini adalah tanda kurung yang diikuti oleh nol literal, diikuti dengan tanda kurung. Kami melanggar spesifikasi di sini dan sebenarnya mengizinkan ekspresi konstanta waktu kompilasi apa pun yang sama dengan nol , dan bukan hanya nol literal.
Jadi, dalam setiap kasus, kami mengizinkan Anda untuk lolos, meskipun secara teknis melakukannya adalah ilegal.
Ada kasus sudut ketika kehadiran tanda kurung dapat mempengaruhi perilaku program:
1.
using System;
class A
{
static void Foo(string x, Action<Action> y) { Console.WriteLine(1); }
static void Foo(object x, Func<Func<int>, int> y) { Console.WriteLine(2); }
static void Main()
{
Foo(null, x => x()); // Prints 1
Foo(null, x => (x())); // Prints 2
}
}
2.
using System;
class A
{
public A Select(Func<A, A> f)
{
Console.WriteLine(1);
return new A();
}
public A Where(Func<A, bool> f)
{
return new A();
}
static void Main()
{
object x;
x = from y in new A() where true select (y); // Prints 1
x = from y in new A() where true select y; // Prints nothing
}
}
3.
using System;
class Program
{
static void Main()
{
Bar(x => (x).Foo(), ""); // Prints 1
Bar(x => ((x).Foo)(), ""); // Prints 2
}
static void Bar(Action<C<int>> x, string y) { Console.WriteLine(1); }
static void Bar(Action<C<Action>> x, object y) { Console.WriteLine(2); }
}
static class B
{
public static void Foo(this object x) { }
}
class C<T>
{
public T Foo;
}
Semoga Anda tidak akan pernah melihat ini dalam praktiknya.
Cara yang baik untuk menjawab pertanyaan seperti ini adalah dengan menggunakan Reflector dan melihat IL apa yang dihasilkan. Anda bisa belajar banyak tentang pengoptimalan compiler dan semacamnya dengan mendekompilasi assemblies.