为什么它总是一个空值?

时间:2012-01-18 09:05:42

标签: c# asp.net .net visual-studio-2010

好的,我得到了下面的类,但当GetIstance(); Visual Studio显示时,item总是为null:

Field 'PageStyle.item' is never assigned to, and will always have its default value null

我该如何解决这个问题?我究竟做错了什么?有没有更好的方法来做下面的事情?

public class PageStyle
{

private static PageStyle _Instance = null;

// Instantiate variables relating to sitecore item paths.
Database webDB;
Sitecore.Data.Items.Item item;

// constructor
private PageStyle()
{
    if (webDB != null)
    {
        webDB = Sitecore.Configuration.Factory.GetDatabase("web");
        Sitecore.Data.Items.Item item = webDB.Items[StartItem];
    }
}

// Method that gets instance
public static PageStyle GetInstance()   
{       
    if (_Instance == null)          
    _Instance = new PageStyle();        
    return _Instance;   
}

private void InitializeWebDB()
{
   if (webDB == null)
   {
    webDB = Sitecore.Configuration.Factory.GetDatabase("web");
   }

}

private void InitializeStartItem()
{
    if (webDB != null)
    {
        item = webDB.Items[StartItem];
    }
}

public string StartItem
{
    get
    {
        return _startItem;
    }

    set
    {
        _startItem = value;
    }
}
}

5 个答案:

答案 0 :(得分:3)

您永远不会将其设置为值。您可能会思考,但您实际上只设置了一个具有相同名称的局部变量。此外,当它始终为null时,您正在检查webDB变量的非空值:

// constructor
private PageStyle()
{
    if (webDB != null)
    {
        webDB = Sitecore.Configuration.Factory.GetDatabase("web");
        Sitecore.Data.Items.Item item = webDB.Items[StartItem];
    }
}

将其更改为:

// constructor
private PageStyle()
{
    this.webDB = Sitecore.Configuration.Factory.GetDatabase("web");
    this.item = webDB.Items[StartItem];
}

我假设你总是需要一个数据库实例,并且if (webDB != null)是一个错误。

答案 1 :(得分:2)

也许您打算在构造函数中分配item

private PageStyle()
{
    if (webDB != null)
    {
        webDB = Sitecore.Configuration.Factory.GetDatabase("web");
        this.item = webDB.Items[StartItem];
    }
}

另外,请确保在某处调用InitializeWebDB私有方法,否则webDB变量也将为空。

像这样:

private PageStyle()
{
    InitializeWebDB();

    if (webDB != null)
    {
        this.item = webDB.Items[StartItem];
    }
}

答案 2 :(得分:0)

构造函数中有一个本地项目实例,它会影响类级别字段。

答案 3 :(得分:0)

你没有在构造函数中初始化它,你创建一个具有相同名称的新局部变量,使用:

// constructor
private PageStyle()
{
    webDB = Sitecore.Configuration.Factory.GetDatabase("web");
    this.item = webDB.Items[StartItem];
}

答案 4 :(得分:0)

也许将webDB init方法放在类之外并使其成为静态不会有害。在您的代码中,您正在检查webDB与null以及GetDatabase()方法中的两次。

您可以像这样对此部分进行编码:

public class PageStyle
{
    private static PageStyle _Instance;

    // Instantiate variables relating to sitecore item paths.
    private static readonly Database webDB = DbInitializer.InitializeWebDb("web");
    ...