SORU
5 Kasım 2008, ÇARŞAMBA


Return deyimi içinde veya bir kilidi dışında olmalıdır?

Ben benim kod bazı yerde kilidin içinde dönüş ifadesi var ve bazen dışarıdan fark ettim. - En iyisi hangisi?

1)

void example()
{
    lock (mutex)
    {
    //...
    }
    return myData;
}

2)

void example()
{
    lock (mutex)
    {
    //...
    return myData;
    }

}

Hangisini kullanmalıyım?

CEVAP
5 Kasım 2008, ÇARŞAMBA


-Şimdiye kadar hangi kodunu basit bir hale getiriyor aslında. Tek çıkış noktası güzel, ama ideal olmaz bend kodu formsuz sadece elde... Ve eğer alternatif olduğunu ilan eden bir yerel değişken (dış kilidi), başlatma (iç kilitleme) ve daha sonra geri dönen (dış kilitle), sonra diyebilirim ki basit bir "return foo" içine kilitlemek çok basit.

IL farkı göstermek için bir kod sağlar

static class Program
{
    static void Main() { }

    static readonly object sync = new object();

    static int GetValue() { return 5; }

    static int ReturnInside()
    {
        lock (sync)
        {
            return GetValue();
        }
    }

    static int ReturnOutside()
    {
        int val;
        lock (sync)
        {
            val = GetValue();
        }
        return val;
    }
}

(mutlu ReturnInside C daha basit/temiz bir bit olduğunu iddia ediyorum unutmayın#)

Ve IL bak (release modu vs.):

.method private hidebysig static int32 ReturnInside() cil managed
{
    .maxstack 2
    .locals init (
        [0] int32 CS$1$0000,
        [1] object CS$2$0001)
    L_0000: ldsfld object Program::sync
    L_0005: dup 
    L_0006: stloc.1 
    L_0007: call void [mscorlib]System.Threading.Monitor::Enter(object)
    L_000c: call int32 Program::GetValue()
    L_0011: stloc.0 
    L_0012: leave.s L_001b
    L_0014: ldloc.1 
    L_0015: call void [mscorlib]System.Threading.Monitor::Exit(object)
    L_001a: endfinally 
    L_001b: ldloc.0 
    L_001c: ret 
    .try L_000c to L_0014 finally handler L_0014 to L_001b
} 

method private hidebysig static int32 ReturnOutside() cil managed
{
    .maxstack 2
    .locals init (
        [0] int32 val,
        [1] object CS$2$0000)
    L_0000: ldsfld object Program::sync
    L_0005: dup 
    L_0006: stloc.1 
    L_0007: call void [mscorlib]System.Threading.Monitor::Enter(object)
    L_000c: call int32 Program::GetValue()
    L_0011: stloc.0 
    L_0012: leave.s L_001b
    L_0014: ldloc.1 
    L_0015: call void [mscorlib]System.Threading.Monitor::Exit(object)
    L_001a: endfinally 
    L_001b: ldloc.0 
    L_001c: ret 
    .try L_000c to L_0014 finally handler L_0014 to L_001b
}

IL düzeyinde ya da bazı isimleri ver] aynı (bir şey öğrendim ;-p). Gibi, en mantıklı karşılaştırma yerel kodlama tarzı, yüksek derecede subjektif hukuk... basitlik için ReturnInside tercih ederim, ama ya heyecanlı olmazdım.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • InfinityWard

    InfinityWard

    19 EYLÜL 2006
  • Jordie Jordan

    Jordie Jorda

    27 Ocak 2008
  • Attempts at least

    Attempts at

    1 Ocak 2007