Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/302.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 为什么在使用C条件运算符时会出现堆栈溢出异常?_C# - Fatal编程技术网

C# 为什么在使用C条件运算符时会出现堆栈溢出异常?

C# 为什么在使用C条件运算符时会出现堆栈溢出异常?,c#,C#,这段代码导致堆栈溢出异常,我不确定原因 public double? Value { get { return Value.HasValue ? (double?)Math.Round(Value.Value, 1) : null; } set { Value = value; } } 因为在Get中,您正在读取属性,导致无限循环。使用

这段代码导致堆栈溢出异常,我不确定原因

public double? Value
    {
        get
        {
            return Value.HasValue ? (double?)Math.Round(Value.Value, 1) : null;
        }
        set
        {
            Value = value;
        }
    }
因为在Get中,您正在读取属性,导致无限循环。使用支持字段

private double? _value;
public double? Value
{
    get { return _value.HasValue ? (double?) Math.Round(_value.Value, 1) : null; }
    set { _value = value; }
}
编辑:我还想指出,很容易认定这是非常糟糕的代码。首先,公开设定者一开始就有点不确定,它只比拥有一个公共领域好一点。另外,在代码中,您可以为一个变量指定一件事,但如果您在之后的行中检查它,则该值已更改,这确实会让人感到困惑。我会考虑将舍入逻辑移到SETER中,如果适用的话,可以去掉零,如果可以的话,可以再次去掉可变性,并在构造函数中注入值。< /P> < P>,因为在您的GET中,您正在读取该属性,从而导致无限循环。使用支持字段

private double? _value;
public double? Value
{
    get { return _value.HasValue ? (double?) Math.Round(_value.Value, 1) : null; }
    set { _value = value; }
}

编辑:我还想指出,很容易认定这是非常糟糕的代码。首先,公开设定者一开始就有点不确定,它只比拥有一个公共领域好一点。另外,在代码中,您可以为一个变量指定一件事,但如果您在之后的行中检查它,则该值已更改,这确实会让人感到困惑。我会考虑将舍入逻辑移到SETER中,如果适用的话,可以去掉零,如果可以的话,再将该可互换性去掉,并在构造函数中注入值。< /P> < P>,因为在SETER中,你给SETER分配了一个值,这意味着SETER再次被调用。setter始终调用自身,因此出现stackoverflow异常。getter也是如此

您应该有一个实变量来存储值:

public double? Value
{
    get
    {
       return myValue.HasValue ? (double?)Math.Round(myValue.Value, 1) : null;
    }
    set
    {
       myValue = value;
    }
}

private double? myValue;

因为在setter中,您正在为setter赋值,这意味着setter将再次被调用。setter始终调用自身,因此出现stackoverflow异常。getter也是如此

您应该有一个实变量来存储值:

public double? Value
{
    get
    {
       return myValue.HasValue ? (double?)Math.Round(myValue.Value, 1) : null;
    }
    set
    {
       myValue = value;
    }
}

private double? myValue;

你的财产有个问题:

您必须使用支持字段,否则将无法存储/获取您的值

您的代码变成:

private double? _value;
public double? Value
{
    get
    {
        return _value.HasValue ? (double?)Math.Round(_value.Value, 1) : null;
    }
    set
    {
       _value = value;
    }
}
你会离开的

堆栈溢出异常来自Math.RoundValue.Value,1

你想得到你财产的价值。因此,您正在调用getter以获得此值。然后,再次点击同一行,再次调用Math.RoundValue.Value,1

然后,它再次调用getter,然后。。。
你明白重点了。

好吧,你的财产有问题:

您必须使用支持字段,否则将无法存储/获取您的值

您的代码变成:

private double? _value;
public double? Value
{
    get
    {
        return _value.HasValue ? (double?)Math.Round(_value.Value, 1) : null;
    }
    set
    {
       _value = value;
    }
}
你会离开的

堆栈溢出异常来自Math.RoundValue.Value,1

你想得到你财产的价值。因此,您正在调用getter以获得此值。然后,再次点击同一行,再次调用Math.RoundValue.Value,1

然后,它再次调用getter,然后。。。
您看到要点了。

支持变量在哪里?您需要属性的支持字段。它正在调用自身。支持变量在哪里?您需要属性的支持字段。它在调用自己。它是一个ViewModel,我认为在ViewModel中使用getter和setter的公共属性是标准的做法。此外,我认为舍入误差来自服务器。您将其设置为7.6,它将返回7.59999…一些其他值。@LeighCooper-那么您应该使用decimal。我同意Martin的观点,如果数据类型不能剪切它,请使用另一个。虽然我承认setter在viewmodel中更容易接受,但我仍然认为在getter中转换值是件好事,部分原因是这会让客户端感到困惑,部分原因是代码在每次获得值时都会运行,而不是在分配值时只运行一次。值作为时间序列存储在Redis服务器中。当通过Setter 5.6或类似值赋值时,服务器会将它们更改为类似于5.599999234的值。因此,作为前端开发人员,我很难改变数据的结构。通常,此ViewModel的值是通过timeseries转换设置的。为什么decimal会更好?它是一个ViewModel,我认为在ViewModel中使用getter和setter的公共属性是标准的做法。此外,我认为舍入误差来自服务器。您将其设置为7.6,它将返回7.59999…一些其他值。@LeighCooper-那么您应该使用decimal。我同意Martin的观点,如果数据类型不能剪切它,请使用另一个。虽然我承认setter在viewmodel中更容易被接受,但我仍然认为在getter中转换值是一件好事,部分原因是这会让客户端感到困惑,部分原因是代码在每次获得值时都会运行,而不是在分配值时只运行一次。值存储在Redis服务器中 作为一个时间序列。当通过Setter 5.6或类似值赋值时,服务器会将它们更改为类似于5.599999234的值。因此,作为前端开发人员,我很难改变数据的结构。通常,此ViewModel的值是通过timeseries转换设置的。为什么十进制更好?