繁体   English   中英

静态与非静态方法与成员交互

[英]static Vs non static methods & members interaction

我有一个WebMethod ,它是Ajax自动完成扩展器的数据源。

FontnmsList_AutCpltDataSrc()

因此它必须是static ,...除非我要通过另一种方法(例如Web Service来实现它,因为我不想使用它,但实际上,这绝对不是问题。

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

现在,正如我被建议不要使用static一样 (指asp.net ),并且在尝试遵循该建议时,

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

这是我在当前项目中遇到的一个示例。

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

}

现在这是负责自动完成扩展程序的网络方法

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 ,我可以考虑传入非静态的数据作为参数,

所以我在这里想念什么。 上面的带下标代码的正确解决方案是什么?

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

只有3个选项:

  1. 您可以创建具有所需方法的对象的单个静态实例。 仅当此实例可以重置或不具有任何状态时,此方法才起作用。
  2. 您可以在每个调用上创建一个新实例并使用它。
  3. 使所有内容保持静态。 (不建议)

有时,实例方法只需要实例中的1或2条状态信息,在这种情况下,将它们转换为静态状态并让实例方法使用额外的状态信息调用静态方法会更容易。 在这里检查是否是这种情况。

例如,假设您有一个非常简单的类,如下所示:

public class something
{
  public int One { get;set; }
  public int Two { get;set; }

  public int Add()
  {
    return One + Two;
  }
}

并且您有一个需要调用Add的静态方法,则可以将上面的代码重构为下面的代码,这样您就不必在静态方法中再创建一个实例,但是仍然可以将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。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM