Bir örnek C # koduna bakıyordum ve bir örneğin dönüşü () 'lerin içine sardığını fark ettim.
Ben hep yaptım:
return myRV;
Şunları yapmakta bir fark var mı:
return (myRV);
Yanıtlar:
GÜNCELLEME: Bu soru, blogumun 12 Nisan 2010 tarihli konusuydu . Eğlenceli soru için teşekkürler!
Pratikte hiçbir fark yoktur.
Gelen teori bir fark var olabilir. C # belirtiminde bunun bir fark oluşturabileceği üç ilginç nokta vardır.
İlk olarak, anonim işlevlerin temsilci türlerine ve ifade ağaçlarına dönüştürülmesi. Aşağıdakileri göz önünde bulundur:
Func<int> F1() { return ()=>1; }
Func<int> F2() { return (()=>1); }
F1
açıkça yasaldır. Mı F2
? Teknik olarak hayır. Spesifikasyon 6.5 bölümünde lambda ifadesinden uyumlu bir temsilci türüne bir dönüşüm olduğunu söylüyor . Bu bir lambda ifadesi mi? Hayır . Lambda ifadesi içeren parantezli bir ifadedir .
Visual C # derleyicisi burada küçük bir özellik ihlali yapar ve parantezi sizin için atar.
İkinci:
int M() { return 1; }
Func<int> F3() { return M; }
Func<int> F4() { return (M); }
F3
yasaldır. Mı F4
? Hayır. Bölüm 7.5.3, parantezli bir ifadenin bir yöntem grubu içermeyebileceğini belirtir. Yine, size kolaylık sağlamak için şartnameyi ihlal ediyor ve dönüşüme izin veriyoruz.
Üçüncü:
enum E { None }
E F5() { return 0; }
E F6() { return (0); }
F5
yasaldır. Mı F6
? Hayır. Spesifikasyon, değişmez sıfırdan numaralandırılmış herhangi bir türe bir dönüşüm olduğunu belirtir. " (0)
" değişmez sıfır değil, bir parantez ve ardından değişmez sıfır ve ardından bir parantez geliyor. Buradaki şartnameyi ihlal ediyoruz ve aslında sıfıra eşit herhangi bir derleme zamanı sabiti ifadesine izin veriyoruz , sadece sıfıra değil.
Bu nedenle, her durumda, teknik olarak yasadışı olmasına rağmen, bundan kurtulmanıza izin veriyoruz.
Parantezlerin varlığının program davranışı üzerinde etkili olabileceği önemli durumlar vardır:
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;
}
Umarım bunu pratikte asla görmezsiniz.
Bunun gibi soruları yanıtlamanın iyi bir yolu, Reflektör kullanmak ve hangi bilgi okunun üretildiğini görmektir. Derleyici optimizasyonları ve benzerleri hakkında derlemeleri yeniden derleyerek çok şey öğrenebilirsiniz.