Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typescript/9.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#_Obfuscation - Fatal编程技术网

C# 模糊代码有时有用吗?

C# 模糊代码有时有用吗?,c#,obfuscation,C#,Obfuscation,在使用C#中的单精度坐标值创建自定义3D点类时,我必须编写一个方法来计算两点之间的距离。然后我想到了A->B图形符号,意思是“从A到B”,我想到了重载操作符,因为认为点A“大于”点B是没有意义的(此外,->操作符不能重载) 因此,我创建了以下方法: /// <summary> /// Calculates the Manhattan distance between the two points. /// </summary> public static float op

在使用C#中的单精度坐标值创建自定义3D
类时,我必须编写一个方法来计算两点之间的距离。然后我想到了
A->B
图形符号,意思是“从A到B”,我想到了重载
操作符,因为认为点A“大于”点B是没有意义的(此外,
->
操作符不能重载)

因此,我创建了以下方法:

/// <summary>
/// Calculates the Manhattan distance between the two points.
/// </summary>
public static float operator>(Point p1, Point p2)
{
    return Math.Abs(p1.X - p2.X) +
           Math.Abs(p1.Y - p2.Y) +
           Math.Abs(p1.Z - p2.Z);
}

/// <summary>
/// Calculates the euclidean distance between the two points.
/// </summary>
public static double operator>=(Point p1, Point p2)
{
    return Math.Sqrt(Math.Pow(p1.X - p2.X, 2) +
                     Math.Pow(p1.Y - p2.Y, 2) +
                     Math.Pow(p1.Z - p2.Z, 2));
}
代码看起来很模糊,但是一旦你掌握了它,它就很容易阅读,而且比使用
A.DistanceTo(B)
要短


问题是,我应该完全避免这种代码吗?如果是,原因是什么?我非常关心干净的代码,我不确定这是否是干净的。如果您认为这样的代码有时是允许的,您能提供一些例子吗?

通常您应该避免使用这种代码(除非它可能是更深入的DSL的一部分)

用意外的行为重写常见的运算符和方法会使您很难提取、理解和调试代码

假设你正在读一本书,虽然这些单词看起来像英语,但作者在后面的附录中做了一些注释,从而改变了几个关键词的含义,因此你不断地来回翻动,检查每个句子的意思是否与你认为的一样


代码应该被编写成供人类阅读。你做这项任务越容易,加入的惊喜越少,效果就越好。

在这种特殊情况下,是的,因为
=
操作符几乎被普遍称为“大于或等于”,而你在这里颠覆了很多。大多数人会看着这个操作符,想“为什么它不告诉我
A
是否大于
B
?”在6个月后,你将维护你的代码,并开始想为什么你要检查A是否大于B。用
distance to
方法代替它是不是很糟糕?对我来说,这更清楚地解释了你在做什么。也许你可以使用另一个对类没有意义的操作符,比如>>(位位移)同样,越大越大的相等对一个点有意义,把它看作一个向量,你可以取它的长度,然后比较它们…@DangerZone,在一个项目上工作的人从来都不是一个人。至少,现在有您,将来您将尝试维护自己的代码。这种半运算符重新定义太可爱了,这只是自找麻烦。我完全理解你的答案,但你如何解释函数式编程语言,如F#?这些语言中的代码几乎都是可读的,但它们正日益流行。此外,在游戏(3d程序,you get me;))中,数学是很常见的替换运算符的方法,例如,非常常见的更改是更改“*”运算符到向量的点积。我认为函数式语言的可读性只是熟悉程度的问题。函数式语言可以是高度可读的(并且简洁!)。重要的一点是如果我学习F#,我应该用规范的风格写它,这样其他知道F#的人就可以很容易地阅读它。@Gusman向量的点积在这种情况下是乘法,所以实际上是使用乘法运算符来执行乘法。@Servy Yes和no,乘法应该返回相同类型的对象,点积从结构/类返回标量,因此它不完全相同,乘法应该是{x=a.x*b.x,y=a.y*b.y}
var manhattan = A > B;
var euclidean = A >= B;