发表日期:2018-03-17 21:00文章编辑:和平网络浏览次数: 标签: SEO时代
作为有关 C# 语言类型漫谈的继承,网站建设公司,本月我们将接头运算符重载的问题。运算符重载(除非出格指明,不然本专栏的其余
部门一律将其简称为“重载”)是指答允用户利用用户界说的范例编写表达式的本领。它答允用户界说的范例与预界说的
范例具有沟通的成果。
譬喻,凡是需要编写雷同于以下内容的代码,以将两个数字相加。很明明,sum 是两个数字之和。
int i = 5;
int sum = i + j;
假如可以利用代表复数的用户界说的范例来编写沟通范例的表达式,那虽然是最好不外了:
Complex i = 5;
Complex sum = i + j;
运算符重载答允为用户界说的范例重载(即指定明晰的寄义)诸如“+”这样的运算符。假如不举办重载,则用户需要编写
以下代码:
Complex i = new Complex(5);
Complex sum = Complex.Add(i, j);
此代码可以很好地运行,但 Complex 范例并不能象语言中的预界说范例那样发挥浸染。
任何工作都有特定的时间和场合
运算符重载是一个容易引起误解的语言成果,并且编程人员看待它的立场也截然不同。一些人认为:用户利用这一成果编
写的措施将令人费解,并且它也不该归于编程语言。另一些人则认为它是一个很不错的成果,在任那里所都可以利用。
这两种概念既包括正确的身分,但也有欠妥之处。应该认可,运算符重载大概会导致编写出的措施令人费解,但按照我的
履历,纵然不利用运算符重载,也很大概编写出令人费解的代码。在某些环境下,不利用重载甚至会使代码越发令人费
解。
那些不分场所、随意利用重载的人“确实”在出产令人费解的代码。
在语言中之所以利用重载,是为了在观念上对用户的类或布局举办简化。只有在有助于提高用户所写代码的可读性时,才
能对运算符举办重载。请留意,我们所说的检讨尺度是“更清晰”,而不是“更简短”。运用了运算符重载的类险些老是
会使代码变得更简短,但并不能每次都使代码变得更清晰(即可读性更强)。
为了说明这一点,我建立了多个重载示例。您需要仔细阅读这些代码,想一想哪个运算符举办了重载,免费建站系统,重载的运算符执行
了什么运算。
考试
1
BigNum n1 = new BigNum("123456789012345");
BigNum n2 = new BigNum("11111");
BigNum sum = n1 + n2;
B
Matrix m1 = loadMatrix();
Matrix m2 = loadMatrix();
Matrix result = m1 * m2;
iii
DBRow row = query.Execute();
while (!row.Done)
{
Viewer.Add(row);
row++;
}
IV
Account current = findAccount(idNum);
current += 5;
谜底和接头
1
本示例中,要执行的运算是显而易见的。这种加法只不外是将预界说的范例相加,每小我私家都大白执行了什么运算,因此在
这个示例中,利用运算符重载很有意义。
B
本示例演示了矩阵如何相乘。从观念上来说,矩阵乘法与通例乘法不完全雷同,但它是一个明晰界说的运算,因此任何理
解矩阵乘法的人看到这种重载的运算符时,都不会感想惊奇。
iii
本示例中,增量 (++) 运算符举办了重载,它使数据库行向前移至下一行。任何与数据库行有关的事物都不行能使我们理
解这种增量的真正寄义,并且,这种增量要执行的运算也不是那么明明。
在这一示例中,重载的利用也没有使代码变得更简朴。假如我们转而利用以下代码,环境就许多几何了:
DBRow row = query.Execute();
while (!row.MoveNext())
{
Viewer.Add(row);
}
IV
将事物和雇员相加代表什么寄义呢?本示例中,选择是一个不错的要领,将其与雇员数相加就会注册雇员。这是一种很糟
糕的运算符重载用法。
原则
何时举办重载的原则是相当简朴的。假如用户但愿能执行这种运算,和平网站建设,那么就应该举办重载。
重载算术运算符
要重载 C# 中的运算符,指定要执行运算的函数就可以了。函数必需在运算所涉及的范例中举办界说,而且至少有一个参
数属于该范例。这样可以防备对 int 的加法或其它奇怪事物举办重载。
为了演示重载,我们将开拓一个矢量。矢量可以被认为是从原点到特定二维点的线。可以对矢量执行多种运算。以下是该
范例的大致界说:
struct Vector
{
float x;
float y;
public Vector(float x, float y)
{
this.x = x;
this.y = y;
}
}
要实际利用,矢量应支持以下运算:
获取长度
将矢量乘以某个数字
将矢量除以某个数字
将两个矢量相加
将一个矢量减去另一个矢量
计较两个矢量的点积
我们的任务是确定应该如何实现这些运算。
长度
对付获取矢量的长度,好像没有任何有意义的运算符。长度不会变革,因此将它作为属性是很有意义的:
public float Length
{
get
{
return((float) Math.Sqrt(x * x + y * y));
}
}
将矢量乘以/除以