C# 有没有一种方法可以简化检查值是否是某事物的倍数而不是0?
我有以下代码:C# 有没有一种方法可以简化检查值是否是某事物的倍数而不是0?,c#,C#,我有以下代码: if (Settings.Trk3 % 20 == 0 && Settings.Trk3 > 0) // Do something 看起来可能有更好的编码方法,但我想不出怎么做。有人有什么建议吗?如果扩展方法是代码库中的常见操作,我会使用扩展方法,但如果它是一次性检查,那么我会让您的代码保持原样,因为您现有的代码清楚地表明了意图,而且大于零和模除是应该分开的不同操作 也就是说,下面是扩展方法的样子: public static class Inte
if (Settings.Trk3 % 20 == 0 && Settings.Trk3 > 0)
// Do something
看起来可能有更好的编码方法,但我想不出怎么做。有人有什么建议吗?如果扩展方法是代码库中的常见操作,我会使用扩展方法,但如果它是一次性检查,那么我会让您的代码保持原样,因为您现有的代码清楚地表明了意图,而且大于零和模除是应该分开的不同操作 也就是说,下面是扩展方法的样子:
public static class IntegerExtensions
{
public static Boolean IsNonZeroMultipleOf( this Int32 value, Int32 divisor)
{
return ( value > 0 ) && ( value % divisor ) == 0;
}
}
用法:
if( Settings.Trk3.IsNonZeroMultipleOf( 20 ) )
{
// Do something.
}
// Note that `Settings.Trk3` is still an `Int32`. The assignment to `MyInteger` works because of the `implicit operator` feature.
MyInteger mi = Settings.Trk3;
if( mi >> 20 )
{
// Do something.
}
关于性能:JIT应该足够智能,可以内联琐碎的非虚拟方法调用,特别是对纯函数(包括扩展方法),因此在绝对必要的情况下,在紧密循环中使用此代码是安全的。(我认为没有必要使用[Pure]
属性)
然而,如果你想成为一个绝对糟糕的程序员,那么就使用一个自定义结构,它隐式地转换为Int32,并使用一个重载操作符。此代码(滥用)>
运算符执行上述相同的IsNonZeroMultipleOf
操作。(至少通过使用>
对用户来说,更明显的是发生了一些奇怪的事情,而不是重载%
操作符):
用法:
if( Settings.Trk3.IsNonZeroMultipleOf( 20 ) )
{
// Do something.
}
// Note that `Settings.Trk3` is still an `Int32`. The assignment to `MyInteger` works because of the `implicit operator` feature.
MyInteger mi = Settings.Trk3;
if( mi >> 20 )
{
// Do something.
}
因为此代码使用的是值类型为d的结构,只进行非虚拟调用,并且没有堆分配(
new
用于C#中结构的堆栈分配,而不仅仅用于GC堆)这段代码也应该适合在零影响的性能关键代码中使用。如果它是代码库中的常见操作,我会使用扩展方法,但如果它是一次性检查,那么我会让您的代码保持原样,因为您现有的代码清楚地表明了意图,而且大于零和模除是不同的操作这应该分开
也就是说,下面是扩展方法的样子:
public static class IntegerExtensions
{
public static Boolean IsNonZeroMultipleOf( this Int32 value, Int32 divisor)
{
return ( value > 0 ) && ( value % divisor ) == 0;
}
}
用法:
if( Settings.Trk3.IsNonZeroMultipleOf( 20 ) )
{
// Do something.
}
// Note that `Settings.Trk3` is still an `Int32`. The assignment to `MyInteger` works because of the `implicit operator` feature.
MyInteger mi = Settings.Trk3;
if( mi >> 20 )
{
// Do something.
}
关于性能:JIT应该足够智能,可以内联琐碎的非虚拟方法调用,特别是对纯函数(包括扩展方法),因此在绝对必要的情况下,在紧密循环中使用此代码是安全的。(我认为没有必要使用[Pure]
属性)
然而,如果你想成为一个绝对糟糕的程序员,那么就使用一个自定义结构,它隐式地转换为Int32,并使用一个重载操作符。此代码(滥用)>
运算符执行上述相同的IsNonZeroMultipleOf
操作。(至少通过使用>
对用户来说,更明显的是发生了一些奇怪的事情,而不是重载%
操作符):
用法:
if( Settings.Trk3.IsNonZeroMultipleOf( 20 ) )
{
// Do something.
}
// Note that `Settings.Trk3` is still an `Int32`. The assignment to `MyInteger` works because of the `implicit operator` feature.
MyInteger mi = Settings.Trk3;
if( mi >> 20 )
{
// Do something.
}
因为此代码使用的是值类型的d结构,只进行非虚拟调用,并且没有堆分配(new
用于C#中结构的堆栈分配,而不仅仅用于GC堆),所以此代码也应该适合在性能关键型代码中使用,不会产生任何影响。If(Math.DivRem(Settings.Trk3,20,out-var-resident)>0和余数==0)
?如果(Math.DivRem(Settings.Trk3,20,out-var-rements)>0和余数==0)
?