首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SPList实例成员抛出一个NullReferenceException

SPList实例成员抛出一个NullReferenceException
EN

Stack Overflow用户
提问于 2013-11-12 14:58:42
回答 1查看 266关注 0票数 0

长话短说..。我有一个类(在我的示例场景中,它是一个应用程序页面),它包含对SPList的引用。

代码语言:javascript
复制
public partial class ApplicationPage1 : LayoutsPageBase
{
    private static SPList _list = GetSPList();

    private static SPList GetSPList()
    {
        try
        {
            return SPContext.Current.Web.GetList("/Lists/CoreConfiguration");
        }
        catch (FileNotFoundException)
        {
            return null;
        }
    }

    protected void BtnRunQuery_OnClick(object sender, EventArgs e)
    {
        Debug.WriteLine(_list.Author.Name);
    }
}

有趣的部分显然是按钮单击事件。因为第一次它总是起作用。也许如果你幸运的话,第二次或第三次成功。但是,它几乎从来没有第四次工作,在这一点上,它抛出一个NullReferenceException。抛出异常的不是列表本身,而是类的一些成员。显然,SPList对象是死的而不是活着的。

因此,很显然,保存对SPList的引用并不是一个好主意。每一次都要遵循设计模式来获取列表吗?每一次请求?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-11-12 17:08:04

不,在SPList字段中保存一个static实例并不是最好的主意。事实上,你不能那么做。正如SPContext.Current的名称所示,它是当前特定时间点上的上下文。简单地说,它是特定于请求的,SPList实例也是如此。

每次需要时,您都必须检索一个新的SPList实例。在内部,它被绑定到SPWeb实例,对于它来说是一样的--它无法在请求之间生存。这里的经验法则是:在只有一个静态SPList实例的情况下,如何区分不同用户的权限?

附带注意:第一个请求成功的原因很简单:您的类在第一次使用时由CLR初始化,这显然是在第一个请求期间。然后,CRL调用类‘’es静态构造函数,该构造函数计算静态成员的值,而且由于SPContext.Current在当时有效,它会接缝工作。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19932498

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档