结构和堆栈溢出C#

时间:2011-03-31 21:03:26

标签: c# struct

您好,我正在编写的这个程序使用下面的结构。我一直收到stackoverflow错误,异常是在公共字符串sessionID set ...(其中“>>>”是)的第一个括号中停止程序。

  public struct SessionStruct 
{
    public string sessionID
    {
        get
        {
            return sessionID;
        }
        set
  >>>   {
            sessionID = value;
        }
    } 
    public DateTime time
    {
        get
        {
            return time;
        }
        set
        {
            time = value;
        }
    }

    public string type
    {
        get
        {
            return type;
        }
        set
        {
            type = value;
        }
    } 
};

以下是设置结构的代码:

if (type == "11" || type == "9")
                {
                    s.sessionID = attributeArray[0].ToString();
                    s.time = DateTime.Now;
                    if (type == "9")
                        s.type = attributeArray[4].ToString();
                }
                else
                {
                    s.sessionID = null;
                    s.time = DateTime.Now;
                    s.type = null;
                }

先谢谢你的帮助......

8 个答案:

答案 0 :(得分:7)

你正在那个setter中进行无限递归。想一想。 创建一个不同名称的私有成员来获取/设置。

private string sessionID;
public string SessionID
    {
        get
        {
            return sessionID;
        }
        set
        {
            sessionID = value;
        }
    }

答案 1 :(得分:5)

sessionId属性setter将其调用为self,从而导致永久递归。

答案 2 :(得分:4)

你的财产一遍又一遍地呼唤着自己。该属性确实需要一个后备存储来存储数据,这通常是一个私有变量:

private string _sessionID;

public string sessionID
{
    get
    {
        return _sessionID;
    }
    set
    {
        _sessionID = value;
    }
} 

或者让编译器为你做:

public string sessionID
{
    // compiler will create a backing store for you
    get; set; 
} 

答案 3 :(得分:3)

这是因为set属性调用自身(名称相同)。

您可能想要使用autoproperty

public string sessionID
{
    get; set;
} 

答案 4 :(得分:1)

问题是您正在递归sessionID属性。

此:

public string sessionID
{
    get
    {
        return sessionID;
    }
    set
    {
        sessionID = value;
    }
}

将编译成这样的东西:

public string sessionID_get()           { return sessionID_get(); }
public void sessionID_set(string value) { sessionID_set(value);   }

显然这不起作用!

您应该使用支持字段:

private string _sessionID;
public string sessionID
{
    get
    {
        return _sessionID;
    }
    set
    {
        _sessionID = value;
    }
}

或者,您可以让编译器自动为您生成一个:

public string sessionID
{
    get; set;
}

答案 5 :(得分:1)

答案 6 :(得分:0)

如果你自己实现getter和setter,你必须使用一个支持字段,否则它将继续在setter上调用自己,就像这样:

private string _sessionId;
public string sessionID
{
    get
    {
        return _sessionID;
    }
    set
    {
        _sessionID = value;
    }

}

由于您实际上并不需要实现,因为您没有放入任何自定义逻辑,请使用自动属性:

public string sessionID {get;set;}

答案 7 :(得分:0)

您在set访问器中将sessionId分配给自己。 (递归的)

您需要将您正在分配的字段拆分为自己的支持字段,或者使用自动属性。

像这样:

  private string _sessionId;

    public string sessionID
    {
        get
        {
            return _sessionId;
        }
        set
        {
            _sessionId= value;
        }
    } 

或自动属性:

public string sessionId { get;set ;}

另请注意:当您访问set访问器时,您的其他属性会遇到同样的问题。

相关问题