C# 为什么有人要用long.MinValue或long.MaxValue初始化变量?

C# 为什么有人要用long.MinValue或long.MaxValue初始化变量?,c#,C#,最近回顾一些代码,我是的,这是第一次遇到有人在初始化一个很长的程序,而不是我习惯的程序 var thisId = long.minValue 我知道这个常数的值是负的9223372036854775808;即十六进制0x80000000000000 如果不满足某些条件,程序员实际上会返回这个数字,并且在他的逻辑中使用比较逻辑来测试thisId==long.minValue 我的第一个想法是,与使用零或NULL初始化变量相比,这会导致更大的开销……但我发现可能存在这样一种情况,即不能有一个可为N

最近回顾一些代码,我是的,这是第一次遇到有人在初始化一个很长的程序,而不是我习惯的程序

var thisId = long.minValue
我知道这个常数的值是负的9223372036854775808;即十六进制0x80000000000000

如果不满足某些条件,程序员实际上会返回这个数字,并且在他的逻辑中使用比较逻辑来测试thisId==long.minValue

我的第一个想法是,与使用零或NULL初始化变量相比,这会导致更大的开销……但我发现可能存在这样一种情况,即不能有一个可为NULL的long,并且可能有一个值为零

因此,当使用long.MinValue或long.MaxValue初始化变量时,使用此技术是否有任何缺点?

这取决于long.MinValue是否是该方法的有效返回值。如果long.MinValue不是返回类型的有效值,并且仅用于表示“找不到”返回值,则最好使用可为空的long作为返回类型

使用价值观的缺点。在这些情况下,0或long.MinValue代替null是引入了幻数。这使得代码更难理解,更容易出错。例如,考虑这种方法:

public int Min(int[] ints);
如果此方法返回int.MinValue怎么办?它是否有效

或考虑STRIGIN索引方法。如果在字符串中找不到传递的值,则返回-1。虽然不难猜测-1意味着找不到,但它仍然在代码中引入了神奇的数字-1,从而使代码更难阅读。我认为String.IndexOf方法只是为了向后兼容而保留的。

这取决于long.MinValue是否是该方法的有效返回值。如果long.MinValue不是返回类型的有效值,并且仅用于表示“找不到”返回值,则最好使用可为空的long作为返回类型

使用价值观的缺点。在这些情况下,0或long.MinValue代替null是引入了幻数。这使得代码更难理解,更容易出错。例如,考虑这种方法:

public int Min(int[] ints);
如果此方法返回int.MinValue怎么办?它是否有效


或考虑STRIGIN索引方法。如果在字符串中找不到传递的值,则返回-1。虽然不难猜测-1意味着找不到,但它仍然在代码中引入了神奇的数字-1,从而使代码更难阅读。我认为String.IndexOf方法是为了向后兼容而保留的。

为什么有人用long.MinValue初始化它?因为它表示某种特殊的状态。这种状态是什么,取决于上下文。例如,要明确它“没有值”

就我个人而言,我会用一个长的?对于这些情况,一个可为null的long,因为这使变量的状态更加清晰


在我看来,使用long.MinValue的缺点是它本身并不能很好地指示状态。它容易出错,通常只有编写它的程序员才知道它的含义。

为什么有人用long.MinValue初始化它?因为它表示某种特殊的状态。这种状态是什么,取决于上下文。例如,要明确它“没有值”

就我个人而言,我会用一个长的?对于这些情况,一个可为null的long,因为这使变量的状态更加清晰

在我看来,使用long.MinValue的缺点是它本身并不能很好地指示状态。它很容易出错,通常只有编写它的程序员才知道它的含义。

如果其余代码没有给出更好的值,它肯定是错误的。类似于Double.NaN

这种方法在很长一段时间内是可行的,在危险区域内得到一个int。我个人从不这样做,我喜欢bool或nullable,保证不会以这种方式导致事故。更具可读性。当然也可以仅为0,但只有在有效值保证为非零的情况下才能工作。

这是一个,如果其余代码没有找到更好的值,则保证是错误的。类似于Double.NaN

这种方法在很长一段时间内是可行的,在危险区域内得到一个int。我个人从不这样做,我喜欢bool或nullable,保证不会以这种方式导致事故。更具可读性。当然也可以仅为0,但只有在保证有效值不为零的情况下才能工作。

Long.MinValue的典型用例是在该范围内找到一个最大值。这是一个很好的开始条件。在循环中,您可以执行ifcurrentValue>maxValue maxValue=currentValue;如果您在开始时将maxValue指定给0,则可能只有负值,并且在-10、-5和-1中,您将永远不会得到-1,例如。

Long.MinValue的典型用例是在该范围内找到一个最大值。开始了
od作为起始条件。在循环中,您可以执行ifcurrentValue>maxValue maxValue=currentValue;如果您在开始时将maxValue指定给0,则可能只有负值,并且在-10、-5和-1中,您将永远无法得到-1。例如,我的答案是,这取决于正常情况

如果我用一般的方法来处理这个问题

T SomeFunction<T>()
{
    var result = default(T);

    //// do "some stuff"

    return result;
}
现在,默认值何时会不正确?我可以想到两个原因

有些东西是有条件的,所以我优化了我的代码以保存其他东西 T的缺省值是执行某些操作的有效结果,因此我需要区分。
关于你问题的另一个方面,在文字或默认值上使用常量对性能没有任何影响。

我的答案是,这取决于正常情况

如果我用一般的方法来处理这个问题

T SomeFunction<T>()
{
    var result = default(T);

    //// do "some stuff"

    return result;
}
现在,默认值何时会不正确?我可以想到两个原因

有些东西是有条件的,所以我优化了我的代码以保存其他东西 T的缺省值是执行某些操作的有效结果,因此我需要区分。

关于你问题的另一个方面,在文字或默认值上使用常量对性能没有影响。

,只有MinValue也可以是一个有效值…看起来开发人员使用MinValue作为一个神奇的值,仅仅依靠它,有效的计算产生MinValue的可能性要小于零。这不是一个好的做法,但肯定并不少见。实际上.NET FW也会这样做-例如,HttpCache在确定滑动或绝对exipration时使用DateTime.MaxValue。long.MinValue和long.MaxValue是常量值,并生成与将变量设置为0相同的IL指令,例如,所以实际上没有更多的开销。常量是常量,只是MinValue也可以是有效值……看起来开发人员使用MinValue作为神奇值,仅仅依靠它,有效计算产生MinValue的可能性比零的可能性要小。这不是一个好的做法,但肯定并不少见。实际上.NET FW也会这样做-例如,HttpCache在确定滑动或绝对exipration时使用DateTime.MaxValue。long.MinValue和long.MaxValue是常量值,并生成与将变量设置为0相同的IL指令,例如,所以实际上没有更多的开销。常量是常量,为什么int和long之间的区别是常量?它是2*32的区别。数据与sentinel值匹配的几率降低了40亿倍。我不是一个大赌徒,我敢打赌。int是int32,long是int64……就是这样……根据反馈,我会选择long?还有,还有不止一个用途。在这种情况下,它适合rogue或signal value用法。尽管.NET中不支持Double.NaN,但处理器上可以有多个值。有信号sNaN和安静qNaN值:为什么int和long之间有区别?这是一个2*32的区别。数据与sentinel值匹配的几率降低了40亿倍。我不是一个大赌徒,我敢打赌。int是int32,long是int64……就是这样……根据反馈,我会选择long?还有,还有不止一个用途。在这种情况下,它适合rogue或signal value用法。尽管.NET中不支持Double.NaN,但处理器上可以有多个值。有信号sNaN和安静qNaN的价值观:这就是我在发布这篇文章之前的感受……但我希望得到反馈。我通常会去很长时间?同样。同意这是不好的做法。这是我在发布这篇文章之前的感受……但我希望得到反馈。我通常会去很长时间?同样。同意这是不好的做法。良好的总体反应,最重要的是,你关于不损害绩效的评论是我核心问题的答案……谢谢+感谢Jodrellgood的总体回应,最重要的是,您关于不损害性能的评论是我核心问题的答案……谢谢+乔德雷尔一人