SORU
29 Temmuz 2011, Cuma


Bu bir C döndürülen değeri işlemek için hiç de iyi değil# yöntem? Bu örnekte iyi bir uygulama nedir?

Meraktan soruyorum...bazı değer döndüren bir yöntem diyoruz ama/almıyoruz ne olur bunu kullanmak? Ve biz de bazen bu verilen değeri çok büyük görüşünde. Bu değer nereye gidiyor? Hatta oluşturulur? Eğer varsa, oluşabilecek herhangi bir performans sorunları ya da başka sorunlar var mı? (Peki böyle bir durumda en iyi yöntem nedir?)

Hadi veritabanı işlemleri (ınsert, update) ve döner bazı DataTable nesnesinde bazı veriler geliyor bu yöntem. Ve ben de bu DataTable nesnesi gerçekten büyük bazen olabileceğini biliyorum:

public static Datatable InsertIntoDB(...) 
{
      // executing db command, getting values, creating & returning Datatable object...
      ...
      return myDataTable;
}

Ve sonra bu yöntem kullanıldığında bu gibi denir:

DataTable myDataTable = InsertIntoDB(...);
// this Datatable object is handled in some way

Ama bazen sadece bu gibi:

InsertIntoDB(...);
// returned value not handled; Problem???

Benim ilk düşünce düşünme sistemidir zeki görmek döndürülen değer göz ardı edilir ve neden olmaz herhangi bir sorun (sadece serbest) ama ben istiyorum emin ve duymak daha ayrıntılı bir açıklama değil de biri daha deneyimli bu alanda daha beni.

CEVAP
29 Temmuz 2011, Cuma


Döndürülen değer (veya başvuru, bir başvuru türü ise) bu da yığına itilir ve sonra yine yerinden fırladı.

Hiçbir biggy.

Eğer dönüş değeri ilgili değil ise, güvenli bir şekilde bunu yapabilirsiniz.

Ama her ihtimale karşı ilgisi olmadığından emin olun.

İşte bazı kod:

    static string GetSomething()
    {
        return "Hello";
    }

    static void Method1()
    {
        string result = GetSomething();
    }

    static void Method2()
    {
        GetSomething();
    }

Eğer IL bakacak olursak:

Method1:

.locals init ([0] string result)
IL_0000:  nop
IL_0001:  call       string ConsoleApplication3.Program::GetSomething()
IL_0006:  stloc.0
IL_0007:  ret

Method2:

IL_0000:  nop
IL_0001:  call       string ConsoleApplication3.Program::GetSomething()
IL_0006:  pop
IL_0007:  ret

Talimatları aynı sayıda tam olarak. Bu değer, yerel dize sonucu (stloc.saklanır Method1, Kapsam dışına çıktığında silinir. 0), Sadece yığından kaldırır, Method2.

Dönen bir dava 'çok büyük', veri önceden oluşturulmuş ve yöntemi başvuru; verinin kendisi değil döndürür. Referans yerel değişkene atanır ve Çöp toplayıcı değişken kapsam dışında olması, bu yöntemi sonuna) gitti sonra o kadar düzenli olacak. Method1(), Method2(), herhangi bir zaman başvuru yığından attı sonra çöp toplayıcı işe alabilirsiniz.

Eğer gerçekten ihtiyacı varsa ... dönüş değeri göz ardı ederek, çöp toplayıcı potansiyel olarak daha erken çalışmak üzere görevlendirilmiş olan herhangi bir bellek bırakın. Ama içinde çok az var (kesinlikle bu durumda), ama uzun süren bir yöntem ile, bu veri üzerine asılı bir sorun olabilir.

Ama uzak-ve en önemli şey görmezden geldiğin dönüş değeri üzerinde etkili olmanız gereken bir şey olmadığından emin olmak.

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • boniver

    boniver

    17 NİSAN 2006
  • Unbox Therapy

    Unbox Therap

    21 Aralık 2010
  • xCraash

    xCraash

    6 Temmuz 2012