静态Vs非静态方法&成员互动

时间:2012-12-16 23:58:56

标签: c# asp.net session-variables static-methods webmethod

我有一个WebMethod服务于Ajax AutoComplete Extender,因为它是DataSource。

FontnmsList_AutCpltDataSrc()

所以它必须是static,...除非我通过另一种方法实现它......例如Web Service,因为我不想使用,实际上,那不是无论如何这里都有问题。

所以...是一个静态方法,它需要与当前应用程序的其余数据共同工作...... 不是静态的 .. ..这里有点问题..

现在我被建议一般不使用静态(引用asp.net),并且在尝试遵循该建议时,

我可以看到,为了允许与它进行交互...... web方法有点引导我将所有其他应用程序元素/数据类型和方法转换为使用static修饰符,例如,

这是我遇到的当前项目的一个例子。

 
// non static 
public SeSn.CurrentSesionVariablsTmplt ExtractSesnVar()
{
    SeSn.CurrentSesionVariablsTmplt RetrndAppGlobals = SeSn.GetValueAS.ACloneOfGlobalsObj("_CurrentSesionGlobals");
    return (SeSn.CurrentSesionVariablsTmplt)RetrndAppGlobals ;

}

现在这是负责自动填充扩展程序的Web方法

 
public static List<string> FntsList = new List<string>();


[System.Web.Script.Services.ScriptMethod()]
[System.Web.Services.WebMethod(EnableSession = true)]

public static List<string> FontnmsList_AutCpltDataSrc(string prefixText)
{ 

    if (ExtrctSesnVar().Fntlist != null)
    { 
        //here too , non of these are , except for the List of course
        FntsList = RflectMeths.ClassFldsAsList<fntNams>();
        CurrSesnDatabag.Fntlist = FntsList;
        SeSn.Modify(Act.Add, App.VarNms._CurrentSesionGlobals, CurrSesnDatabag);
    }
    else
        FntsList = ExtractSesnVar().Fntlist;

    return AutoComplete.FromListStr(prefixText, FntsList);
}

因此

中的工作需要非静态ExtractSesnVar()

static网络方法FontnmsList_AutCpltDataSrc()范围。

所以这让我很奇怪...... 我在这里缺乏什么基础知识(: 我的意思是,当你开始学习.net时,你有没有进入这个交界处?

以及所谓的真实问题:

作为这种情况的解决方案的工作是什么,(它只有一个例子。因为应该有许多其他'结点',你可以提出这样的结合)

我认为应该有某种方式,在写这两个实体之间的bridge我可以想到传递非静态数据作为参数,

所以我在这里缺少什么。对于上面的子喷射代码,正确的解决方案是什么?

1 个答案:

答案 0 :(得分:1)

我假设您在问:如何从静态方法调用实例方法?

只有3个选项:

  1. 您可以创建具有所需方法的对象的单个静态实例。这仅在此实例可以重置或不保持任何状态时有效。
  2. 您可以在每次通话时创建一个新实例并使用它。
  3. 让一切都变得静止。 (不推荐)
  4. 有时,实例方法只需要实例中的1个或者2个状态信息,在这种情况下,更容易将它们变为静态,并且实例方法使用额外的状态信息来调用静态方法。检查这是否是这种情况。

    例如,假设你有一个非常简单的类:

    public class something
    {
      public int One { get;set; }
      public int Two { get;set; }
    
      public int Add()
      {
        return One + Two;
      }
    }
    

    并且您有一个需要调用Add的静态方法,您可以将上面的代码重构为下面的代码,这样您就不必再在静态方法中创建实例了,但仍然在一个地方添加了逻辑:

    public class something
    {
      public int One { get;set; }
      public int Two { get;set; }
    
      public int Add()
      {
        return Add(One, Two);
      }
    
      internal static int Add(int one, int two) 
      {
        return one + two;
      }
    }
    

    我选择将静态Add方法设置为内部,因此只有程序集和友元组件中的其他类可以调用它。如果在您的场景中有意义,请随意将其公之于众。

    这些都不是理想的,但在您的情况下可能是值得的。 YMMV。