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)