none
(Sumber: milis DOTNET) yield dalam C# tidak dapat diletakkan dalam try ... catch block, solusinya ? RRS feed

  • Diskusi Umum

  • hi,
    saya ada buat fungsi dalam C#, seperti ini:

    public IEnumerable<Perkiraan> GetListAllDataPerkiraan()
            {
                SqlCommand cmd = null;
                SqlDataReader reader = null;
                try
                {
                    cmd = new SqlCommand();
                    cmd.Connection = conn;
                    cmd.CommandText = @"Select * From Tbl_Perkiraan Order By Kode_Perkiraan";
                    reader = cmd.ExecuteReader();
                }
                catch (Exception)
                {
                    throw;
                }
                if (reader.HasRows)
                {
                    while (reader.Read())
                    {
                        Perkiraan perk = null;
                        try
                        {
                            perk = new Perkiraan
                            {
                                KodePerkiraan = reader["Kode_Perkiraan"].ToString().Trim(),
                                NamaPerkiraan = reader["Nama_Perkiraan"].ToString().Trim(),
                                JenisPerkiraan = reader["Jenis_Perkiraan"].ToString().Trim(),
                                KeteranganPerkiraan = reader["Keterangan_Perkiraan"].ToString().Trim()
                            };
                        }
                        catch (Exception)
                        {
                            throw;
                        }
                        yield return perk;
                    }
                }
                try
                {
                    reader.Close();
                    reader.Dispose();
                    cmd.Dispose();
                }
                catch (Exception)
                {
                    throw;
                }
             }

    Kode ini sudah bisa di Run. Pertanyaan saya: apakah sudah benar teknik saya menulis yield di fungsi di atas ?
    mgkn para master .net bisa memberikan sedikit pencerahan.
    thanks



    Best Regards,
    Agnes Sannie [MSFT]
    MSDN Community Support | Feedback to us
    Get or Request Code Sample from Microsoft
    Please remember to mark the replies as answers if they help and unmark them if they provide no help.

    Selasa, 25 Desember 2012 06.54
    Moderator

Semua Balasan

  • Kalau lihat sekilas code-nya, 

    kesan yang pertama di tangkap, banyak sekali try-catch-nya. :)

    yield return bisa di gunakan dalam try-catch selama ada finally untuk close/dispose-nya.

    contohnya bisa dilihat di http://dl.dropbox.com/u/19973434/NetIndonesia/Codes/VbNetYieldDataReader/ModuleMain.vb

    Dijawab oleh: Dede


    Best Regards,
    Agnes Sannie [MSFT]
    MSDN Community Support | Feedback to us
    Get or Request Code Sample from Microsoft
    Please remember to mark the replies as answers if they help and unmark them if they provide no help.

    Selasa, 25 Desember 2012 06.54
    Moderator
  • Buat object yg disposable, knp kok ga pake using aja?

    Setauku berlaku jg buat SqlDataReader. Betul?

    Ane klo coding kaga mau pusing2 mikirin Dispose. Asal pake using, di titik manapun code keluar, pasti akan langsung di-dispose.

    using (var cmd = new SqlCommand())

    {

    /////kode program

    ////// misal error di sini, cmd.Dispose() otomatis dipanggil, krn uda pake using.

    /////kode program

    }

    Dijawab oleh: Radityo Ardi


    Best Regards,
    Agnes Sannie [MSFT]
    MSDN Community Support | Feedback to us
    Get or Request Code Sample from Microsoft
    Please remember to mark the replies as answers if they help and unmark them if they provide no help.

    Selasa, 25 Desember 2012 06.55
    Moderator
  • In general, ini gak masalah.

    Yield dalam using itu cuma masalah kalo lu enumerate tanpa dispose.

    kalo pake foreach(), Take(), TakeUntil() etc itu dah menggunakan dispose dengan benar. Yang bermasalah cuma kalo enumerate (dengan while block) tanpa mendispose IEnumerator nya.

    Dijawab oleh: Hendry Luk


    Best Regards,
    Agnes Sannie [MSFT]
    MSDN Community Support | Feedback to us
    Get or Request Code Sample from Microsoft
    Please remember to mark the replies as answers if they help and unmark them if they provide no help.

    Selasa, 25 Desember 2012 06.56
    Moderator