【问题标题】:static Vs non static methods & members interaction静态与非静态方法和成员交互
【发布时间】:2012-12-04 02:39:16
【问题描述】:

我有一个 WebMethod,它作为数据源提供 Ajax AutoComplete Extender。

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 ;

}

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

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 时,你有没有进入过这个路口?

至于 SO A Real Question 中所谓的内容:

作为这种情况的解决方案的解决方法是什么,(它只是一个例子。因为应该有许多其他像这样的“连接点”,你可以想出)

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

所以我在这里错过了什么。上面的subjetced代码的正确解决方案是什么?

【问题讨论】:

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


    【解决方案1】:

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

    只有三个选项:

    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。

    【讨论】:

    • 您能否像代码示例一样提供更多信息,例如说“需要 1 件或 2 件,很难知道您在说什么(据我所知)状态信息”(顺便说一句,我在@millimoose 的最后一个问题中确实注意到了这一点,我会处理它)
    • 安迪,谢谢,虽然只有一条评论......当你放置额外的转换类时,你可以说“输入Internal...修饰符”或类似的东西(P,因为我了解它应该为应用程序中的静态成员提供服务...
    • 注意到我没有将额外的 Add 方法设为静态!代码更新
    • ..no ,我没有注意到另一个 TRICK ,我在写问题时正在考虑自己,但首先想看看有经验的开发人员在做什么,请参阅我的帖子末尾作为参数部分传递
    • 好的,有两个版本,一个是静态的,一个不是。刚刚刷新浏览器
    猜你喜欢
    • 2012-04-13
    • 2013-08-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-20
    • 1970-01-01
    • 2012-10-20
    相关资源
    最近更新 更多