静态成员访问

Sie*_*eon 0 c# static-methods

我可能会发现这一切都错了,但我有一个名为CategoryControl的用户控件,可能会有很多人喜欢它,因此我认为它的许多功能都可以更好地用作静态方法.我想知道是否有一种"更好"的方式来访问这些方法,然后在整个类中传递一个实例.这些方法是公共静态的,因为它们将通过其他方法更新.想到了扩展方法的想法..?

public CategoryControl(UserCategory userCategory)
{
   InitializeComponent();

   PopulateControl(userCategory, this);
}

private static void PopulateControl(UserCategory userCategory, CategoryControl instance)
{

   SetCategoryTitle(userCategory, instance);

   SetPercentCorrect(userCategory, instance);

   SetQuestionsMissed(userCategory, instance);

   SetBackgroundBar(userCategory, instance);

   SetForegroundBar(userCategory, instance);

}
Run Code Online (Sandbox Code Playgroud)

更新::

更长的故事是我在屏幕上有一个Panel,该面板包含相关的用户类别.相关我的意思是用户可以选择更改课程,从而显示一组新的类别.用户还可以基于他们与软件的交互来改变类别的值.所以...

面板显示课程的类别.

我在面板中维护一个活动的类别控件列表,主窗体告诉面板何时绘制一组新的类别.

public void InitializeProgressPanel(UserCategories parentCategories)
{
   Contract.Requires(parentCategories != null, "parentCategories is null.");

   RemoveAllControlsFromList(_categoryControls);

   UserCategories sortedUserCategories = parentCategories.SortByWorst();

   int categoriesCount = parentCategories.Count();

   int spacer = (Height - (CategoryControl.Controls_Height * categoriesCount)) / categoriesCount+1;

   for (int i = 0; i < sortedUserCategories.Count; i++)
   {
      CategoryControl cc = new CategoryControl((UserCategory)sortedUserCategories[i]);

      cc.Left = 0;

      if (i == 0)
         cc.Top = spacer;
      else
         cc.Top = (Controls[i - 1].Bottom + spacer);

      Controls.Add(cc);
      _categoryControls.Add(cc);

      }
}
Run Code Online (Sandbox Code Playgroud)

Eri*_*ert 8

如果我有一个可以扩展的课程,我当然不会制作扩展方法.请记住,扩展方法的目的是扩展您自己无法扩展的类型.

那么当前的问题是,如果你说:

class C 
{
    public void Foo() { ... }
}
Run Code Online (Sandbox Code Playgroud)

要么

class C
{
    public static void Foo(C c) { ... }
}
Run Code Online (Sandbox Code Playgroud)

我会问一些类似的问题:

  • 该课程是否会被分类?如果是这样,这应该是一个虚拟方法吗?
  • Foo是一个实例对自己做的事情,还是它对它做过的事情?动物自己,但动物由其他人喂养的.

更新:

还有一些问题我会问自己:

  • 您所设置的属性和其他内容是否会发生变化?您在课堂上的可变性越小,测试就越容易,推理就越容易,而且您拥有的错误就越少.如果属性和诸如此类的东西永远不会改变,那么不要在任何方法中设置它们.在构造函数中设置它们然后再也不用担心它们了; 他们是对的.