-5

我的代码有问题。我终于明白了,所以没有错误,但现在我必须处理 stackoverflow ......

有人可以告诉我我的代码有什么问题吗?

    public Matrix Projection
    {
        get { return Projection; }
        protected set 
        {
            Projection = value;
            generateFrustum();
        }
    }

如果你能帮忙就好了!

谢谢

4

4 回答 4

23

您的 set 方法调用自身:Projection = value.

private Matrix _projection = null;
public Matrix Projection
{
    get { return _projection; }
    protected set 
    {
        _projection = value;
        generateFrustum();
    }
}

当您使用以下表格时:

public Matrix Projection { get; set }

您不需要指定变量来存储实际值,但是当您显式实现 get 或 set 时,您应该声明附加变量并在 get、set 实现中使用它。

于 2012-06-03T13:51:35.637 回答
4

get您正在定义您的和set函数的无限递归。

get { return Projection; }

相当于:

get { return get();}.
于 2012-06-03T13:53:08.900 回答
4

属性的 setter 和 getter 被实现为方法(get_X 和 set_X)。

在 Projection 的 setter 中写入Projection = value会导致对set_Projection()from within的递归调用set_Projection()。(同样适用于get_Projection()。)

由于调用周围没有条件,因此递归是无限的。

至于public T PropA { get; set; },它是以下的糖语法:

private T _PropA;

public T PropA
{
    get
    {
        return _PropA;
    }
    set
    {
        _PropA = value;
    }
}

你应该做的是:

private Matrix _projection;

public Matrix Projection
{
    get
    {
        return _projection;
    }
    protected set 
    {
        // Make sure that Matrix is a structure and not a class
        // override == and != operators in Matrix (and Equals and GetHashCode)
        // If Matrix has to be a class, use !_project.Equals(value) instead

        // Consider using an inaccurate compare here instead of == or Equals
        // so that calculation inaccuracies won't require recalculation

        if (_projection != value)
        {
            _projection = value;
            generateFrustum();
        }
    }
}
于 2012-06-13T14:57:53.893 回答
0
public T PropA { get; set; } 

实际上是

T _PropA; public T PropA { get { return _PropA; } set { _PropA = value; } }

所以答案将是

private Matrix _projection = null;
public Matrix Projection
{
    get { return _projection; }
    protected set 
    {
      _projection = value;
      generateFrustum();
    }
}

您可以阅读以下示例以获取更多信息
http://msdn.microsoft.com/en-us/library/ms228503.aspx
http://msdn.microsoft.com/en-us/library/w86s7x04(v=vs. 80).aspx

于 2012-06-13T14:24:08.870 回答