SORU
23 Kasım 2009, PAZARTESİ


'UserControl' C parametreleri ile kurucu#

Bana deli diyebilirsiniz, ama herhangi bir parametre ayarı özellikler ardından bir kurucu aksine parametreleri (gerekirse) kurucular seven bir tip değilim. Benim düşünce süreci: eğer özellikler gerçekten bir nesne inşa etmek gerekiyorsa, oluşturucu gidebilir. İki avantajları:

  1. Bir nesne (hata/istisna olmadan) oluşturulur, benim hedefim iyi olduğunu biliyorum.
  2. Belirli bir özellik ayarlamak için unutmak önlemek yardımcı olur.

Bu zihniyet/usercontrol geliştirme formu konusunda bana acı vermeye başladı. Bu UserControl düşünün:

public partial class MyUserControl : UserControl
{
  public MyUserControl(int parm1, string parm2)
  {
    // We'll do something with the parms, I promise
    InitializeComponent();
  }
}

Eğer bir form üzerinde UserControl bırakırsam tasarım süresi, bir istisna olsun:

Bileşen oluşturma başarısız oldu'' ... . MyUserControl ^br> Sistem.MissingMethodException - Hayır parametresiz yapıcı bu nesne için tanımlanmış.

Bana göre, bu durumdan kurtulmanın tek yolu, varsayılan yapıcı biri başka bir yol biliyor sürece) eklemek gibi görünüyor.

public partial class MyUserControl : UserControl
{
  public MyUserControl()
  {
    InitializeComponent();
  }

  public MyUserControl(int parm1, string parm2)
  {
    // We'll do something with the parms, I promise
    InitializeComponent();
  }
}

Parametresiz yapıcı değil de dahil olmak üzere bütün mesele bu kullanmaktan kaçının. Ve hatta DesignMode özelliği gibi bir şey yapmak için kullanamam:

public partial class MyUserControl : UserControl
{
  public MyUserControl()
  {
    if (this.DesignMode)
    {
      InitializeComponent();
      return;
    }

    throw new Exception("Use constructor with parameters");
  }
}

Bu da çalışmıyor:

if (LicenseManager.UsageMode == LicenseUsageMode.Designtime)

Güzel, devam ediyoruz ...

Benim parametresiz oluşturucu, form üzerinde bırakın ve formun InitializeComponent bu gibi görünecektir:

private void InitializeComponent()
{
  this.myControl1 = new MyControl();

  // blah, blah
}

Ve inan bana, çünkü ben yaptım (Evet, görmezden açıklamalar, Visual Studio tarafından oluşturulan), denedim düşünsen ve geçtim parametreleri InitializeComponent böylece edebilirim iletmek için kurucu MyControl.

Bu aklıma şunu getiriyor:

public MyForm()
{
  InitializeComponent(); // Constructed once with no parameters

  // Constructed a second time, what I really want
  this.myControl1 = new MyControl(anInt, aString);  
}

Bana yapıcı parametreleri ile içsel kullanmak için ihtiyacım yok ikinci bir kurucu eklemek zorunda mıyım? Ve örneğini denetimi iki kez?

Bir şeyi yanlış yapıyor olmalıyım gibi hissediyorum. Düşünceler? Görüşler? Güvence (umarım)?

CEVAP
23 Kasım 2009, PAZARTESİ


Tasarım kararları Windows Forms veya engel daha az parametreli çalışır yolu ile ilgili yapılan .windows için az bileşenleri oluşturur. Onları kullanabilirsiniz, ama ne zaman genel kabul gören mekanizmalar dışında basıyorsun. Bunun yerine, Windows Forms özellikleri ile değerleri başlatma tercih ediyor. Bu geçerli bir tasarım tekniği, değilse de yaygın olarak kullanılır.

Bu bazı avantajları vardır gerçi.

  1. Müşteriler için kullanım kolaylığı. İstemci kodu veri bir avuç izini gerek yok, hemen bir şeyler oluşturmak ve sadece mantıklı (ilginç) sonuçları ile görebilirsiniz.
  2. Tasarımcı için kullanım kolaylığı. Tasarımcı kod daha net ve daha kolay genel olarak ayrıştırılamıyor.
  3. Vazgeçiren tek bir bileşen içinde alışılmadık veri bağımlılıkları. (Microsoft SplitContainer) Bu bir patlamış olsa bile

Düzgün Bu teknikte tasarımcı da çalışmak için formları çok destek var. DefaultValueAttribute, DesignerSerializationVisibilityAttribute BrowsableAttribute gibi şeyler az bir çaba ile zengin bir müşteri deneyimi sağlamak için fırsat verin.

(Bu, windows forms istemci deneyimi için yapılan tek uzlaşma değil. Soyut temel sınıf bileşenleri kıllı da olabilir.)

Parametresiz bir constructor ile yapışmasını öneririm ve windows içinde çalışan tasarım ilkelerini oluşturur. Eğer gerçek bir önkoşul senin olmazsa olmaz UserControl, başka bir sınıfta onları zorlamak saklanması ve bir özelliği üzerinden kontrol etmek için bu sınıfın bir örneğini atayın. Bu endişe biraz daha iyi bir ayrılık da verecektir.

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • David Wills

    David Wills

    31 Aralık 2007
  • Justin Davis

    Justin Davis

    14 Ocak 2008
  • skiesofblack.net

    skiesofblack

    14 HAZİRAN 2009