亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

C#中帶有參數的“ UserControl”構造函數

C#中帶有參數的“ UserControl”構造函數

莫回無 2019-11-27 14:13:14
叫我瘋了,但我是那種喜歡帶參數的構造函數(如果需要)的人,而不是沒有參數后再設置屬性的構造函數。我的思考過程:如果需要屬性來實際構造對象,則應將其放入構造函數中。我有兩個優點:我知道在構造對象時(沒有錯誤/異常),我的對象很好。它有助于避免忘記設置某些屬性。在表單/用戶控件開發方面,這種心態開始傷害我。想象一下UserControl:public partial class MyUserControl : UserControl{  public MyUserControl(int parm1, string parm2)  {    // We'll do something with the parms, I promise    InitializeComponent();  }}在設計時,如果將其UserControl放在表單上,則會得到Exception:無法創建組件'MyUserControl'...System.MissingMethodException-沒有為此對象定義無參數構造函數。在我看來,唯一的解決方法是添加默認構造函數(除非其他人知道一種方法)。public partial class MyUserControl : UserControl{  public MyUserControl()  {    InitializeComponent();  }  public MyUserControl(int parm1, string parm2)  {    // We'll do something with the parms, I promise    InitializeComponent();  }}不包括無參數構造函數的全部目的是避免使用它。而且我什DesignMode至不能使用該屬性來做類似的事情:public partial class MyUserControl : UserControl{  public MyUserControl()  {    if (this.DesignMode)    {      InitializeComponent();      return;    }    throw new Exception("Use constructor with parameters");  }}這也不起作用:if (LicenseManager.UsageMode == LicenseUsageMode.Designtime)很好,繼續前進...我有我的無參數構造函數,可以將其放在表單上,表單的形式InitializeComponent如下:private void InitializeComponent(){  this.myControl1 = new MyControl();  // blah, blah}并相信我,因為我做到了(是的,忽略了Visual Studio生成的注釋),我嘗試弄亂了,然后將參數傳遞給,InitializeComponent以便可以將它們傳遞給的構造函數MyControl。這導致我這樣:public MyForm(){  InitializeComponent(); // Constructed once with no parameters  // Constructed a second time, what I really want  this.myControl1 = new MyControl(anInt, aString);  }對于UserControl要在構造函數中使用with參數的情況,我必須添加第二個不需要的構造函數?并實例化控件兩次?我覺得我一定做錯了。有什么想法嗎?意見?保證(希望)?
查看完整描述

3 回答

?
互換的青春

TA貢獻1797條經驗 獲得超6個贊

有關Windows窗體工作方式的設計決策或多或少排除了Windows窗體組件的參數化.ctors。您可以使用它們,但是當您這樣做時,便會超出公認的機制。而是Windows窗體更喜歡通過屬性初始化值。如果未廣泛使用,這是一種有效的設計技術。

不過,這有一些好處。

  1. 易于客戶使用。客戶端代碼不需要跟蹤一堆數據,它可以立即創建某些內容,并以有意義(如果不感興趣)的結果來查看它。

  2. 設計者易于使用。通常,設計器代碼更清晰,更易于解析。

  3. 阻止單個組件中異常的數據依賴關系。(盡管甚至Microsoft都用吹滅了它SplitContainer

表單中也有很多支持,可以與設計師一起使用此技術。,和這樣的東西DefaultValueAttribute,使您有機會以最小的努力提供豐富的客戶體驗。DesignerSerializationVisibilityAttributeBrowsableAttribute

(這并不是在Windows窗體中為客戶體驗做出的唯一折衷。抽象基類組件也可能變得毛茸茸。)

我建議堅持使用無參數構造函數,并在Windows窗體設計原則中進行工作。如果UserControl必須執行一些實際的先決條件,則將它們封裝在另一個類中,然后通過一個屬性將該類的實例分配給您的控件。這也將更好地分離關注點。


查看完整回答
反對 回復 2019-11-27
?
寶慕林4294392

TA貢獻2021條經驗 獲得超8個贊

不幸的是,這是一個經常發生的設計問題,而不僅僅是控制空間。

在很多情況下,即使無參構造函數不是理想的,您也需要有無參構造函數。例如,如果沒有無參數構造函數,則許多值類型IMO會更好,但是創建一個可以那樣工作的類型是不可能的。

在這些情況下,您僅需以最佳方式設計控件/組件。使用合理的(最好是最常用的)默認參數可以極大地幫助您,因為您至少(希望)可以使用良好的值初始化組件。

另外,嘗試以某種方式設計組件,以便在生成組件后可以更改這些屬性。使用Windows Forms組件通常很好,因為在安全加載時間之前,您幾乎可以做任何事情。

再次,我同意-這不是理想的選擇,但這只是我們必須與之共處和解決的問題。


查看完整回答
反對 回復 2019-11-27
  • 3 回答
  • 0 關注
  • 960 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號