我具有其中许多线出现4次,我去通过置换一些非常低效的代码“<”和“>”的操作和各种变量和常量。 这似乎是有一次写的功能,并通过与必然改变价值观和“裁判”变量一起经营的方式。 我有什么技术来学习? “代表们”已经提出,但我不明白如何以这种方式使用它们。 这是在C#2.0,VS2005,但如果技术是通用的,可以用C ++也可以使用,那将是巨大的。
请求对于一些代码:以下出现在许多不同的形式,用不同的“<”和“>”符号以及的“+”和混合“ - ”符号:
if (move[check].Ypos - move[check].height / 200.0D < LayoutManager.VISIO_HEIGHT - lcac_c.top)
{
move[check].Ypos = move[check].Ypos + adjust;
.
.
.
在C ++中,使用std::less
和std::greater
函子。 这两种方法都继承std::binary_function
,所以你的泛型函数应该接受这种类型的实例。
在.NET中,相当于std::binary_function
是Func<T, U, R>
有没有等同std::less
和std::greater
,但它是相当微不足道的创建。 请看下面的例子。
static class Functor
{
static Func<T, T, bool> Greater<T>()
where T : IComparable<T>
{
return delegate(T lhs, T rhs) { return lhs.CompareTo(rhs) > 0; };
}
static Func<T, T, bool> Less<T>()
where T : IComparable<T>
{
return delegate(T lhs, T rhs) { return lhs.CompareTo(rhs) < 0; };
}
}
注意,上面的代码使用Func<>
类从.NET 3.5。 如果这是不能接受的,考虑定义你自己的代表。
C ++调用示例:
void DoWork(const std::binary_function<int, int, bool>& myOperator,
int arg1, int arg2)
{
if (myOperator(arg1, arg2)) { /* perform rest of work */ }
}
void main()
{
DoWork(std::less<int>(), 100, 200);
DoWork(std::greater<int>(), 100, 200);
}
C#调用示例:
void DoWork(Func<int, int, bool> myOperator, int arg1, int arg2)
{
if (myOperator(arg1, arg2)) { /* perform rest of work */ }
}
void main()
{
DoWork(Functor.Less<int>(), 100, 200);
DoWork(Functor.Greater<int>(), 100, 200);
}
编辑 :我校正函子类的实例作为应用<或>运营商的通用型不工作(以相同的方式,因为它与C ++模板一样)。
在C#中使用委托传递了“ <
”和“ >
”操作与正在做的工作的代码。
C#实施例:
public delegate bool BooleanOperatorDelegate(int a, int b)
class OperatorsImplementer {
public bool OperatorLess(int a, int b) {
return a < b;
}
}
class AnotherOperatorsImplementer {
public bool OperatorLess(int a, int b) {
return (a + 1) < (b - 1);
}
}
class OperatorUser {
int DoSomethingObscene(int a, int b, BooleanOperatorDelegate operator) {
if (operator(a, b)) {
return 5;
}
else {
return -5;
}
}
}
您也应该检查你的paramater委托不为NULL。
这是这样做的C法:
bool (*operator_func)(float a, float b)
在比较器类定义枚举操作后
public static class Comparer
{
public static bool IsTrue<T, U>(T value1, Operator comparisonOperator, U value2)
where T : U
where U : IComparable
{
switch (comparisonOperator)
{
case Operator.GreaterThan:
return value1.CompareTo(value2) > 0;
case Operator.GreaterThanOrEqual:
return value1.CompareTo(value2) >= 0;
case Operator.LessThan:
return value1.CompareTo(value2) < 0;
case Operator.LessThanOrEqual:
return value1.CompareTo(value2) <= 0;
case Operator.Equal:
return value1.CompareTo(value2) == 0;
default:
return false;
}
}
public enum Operator
{
GreaterThan = 1,
GreaterThanOrEqual = 2,
LessThan = 3,
LessThanOrEqual = 4,
Equal = 5
}
}
你可以这样调用:
if (IsTrue(var1, Operator.GreaterThanOrEqual, var2))
Console.WriteLine("var1 is greater than var2");
else
Console
.WriteLine("Unfortunately var1 is not greater than or equal var2. Sorry about that.");