02010901 表达式和运算符
02010901 表达式和运算符
1. 比较运算符
- 关系比较运算符和相对比较运算符用于比较它们的操作数并返回bool型值。与C和C++不同,C#中数字不具有布尔意义。
2. 比较操作和相等操作
左边a和b的引用相同返回true;右边引用不同,即使两个AClass对象的内容完全相同,任然返回false。
-
对于大多数引用类型来说,比较它们的相等时,只比较它们的引用,这称为浅比较。
- 如果引用相等,也就是说它们指向内存中相同的对象,那么想等下为true,否则为false。
-
string类型对象也是引用类型,但它的比较方式不同。比较字符串的相等性是,将比较它们的长度和内容(区分大小写),这称为深比较。
- 如果两个字符串有相同的长度和内容(区分大小写),那么相等性返回true,即使它们占用不同的内存区域。
- 委托也是引用类型,并且也是深比较。比较委托的想等性时,如果两个委托都是null,或两者的调用列表中有相同数目的成员,并且调用列表相匹配,那么比较返回true。
3. 运算符重载
3.1 运算符重载是什么
- C#运算符被定义为使用预定义类型作为操作数来工作。如果面对一个用户定义类型,运算符完全不知道如何处理它。
- 运算符重载允许你定义C#运算符应该如何操作自定义类型的操作数。
3.2 运算符重载的注意事项
- 运算符重载只能用于类和结构。
- 为类和结构重载一个运算符x,可以声明一个名称为operator的方法并实现它的行为(例如operator +和operator - 等)。
- 一元运算符的重载方法带有一个单独的class或struct类型的参数。
- 二元运算符的重载方法带有两个参数,其中至少有一个必须是class或struct类型。
public static LimitedInt operator - (LinmitedInt x) // 一元
public static LimitedInt operator + (LimitedInt x, double y) // 二元。
注意,运算符重载的方法声明需要以下条件:
1. 声明必须同时使用static和public修饰符。
2. 运算符必须是要操作的类或结构的成员。
- 运算符重载基本格式
class LimitedInt Return
{
public static LimitedInt operator + (LimitedInt x, double y) // @1
{
LimitedInt li = new LimitedInt();
li.TheValue = x.TheValue + (int)y;
return li;
}
public static LimitedInt operator - (LimitedInt x)
{
LimitedInt li = new LimitedInt();
li.TheValue = 0; // 在这个LimitedInt类中,减值就是赋值为0。
return li;
}
}
注意,在@1处:
1. public static是必须的。
2. operator是关键字。
3. +是运算符。
4. LimitedInt x和double y是操作数,操作数必须有一个是class或struct类型。
- 不是所有运算符都能被重载,本书后面章节会讨论。
4. typeof运算符
- typeof运算符返回作为其参数的任何类型的System.Type对象。通过这个对象,可以了解类型的特征。
- 对任何一直类型,只有一个System.Type对象。不能重载typeof运算符。
// typeof运算符语法示例
Type t = typeof(SomeClass); // Type是System命名空间中的一个类。
—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—
// 使用typeof运算符获取SomeClass类的信息,并打印出它的供公有字段和方法的名称。
using System;
using System.Reflection; // 使用反射命名空间来全面利用检测类型信息的功能
namespace Demo01
{
class SomeClass
{
public int Field1;
public int Field2;
public void Method1()
{
}
public void Method2()
{
}
}
class Program
{
static void Main()
{
Type t = typeof(SomeClass);
FieldInfo[] fi = t.GetFields();
MethodInfo[] mi = t.GetMethods();
foreach (FieldInfo f in fi)
Console.WriteLine($"Field: {f.Name}");
foreach (MethodInfo m in mi)
Console.WriteLine($"Method: {m.Name}");
Console.ReadLine();
}
}
}
控制台输出:
Field: Field1
Field: Field2
Method: Method1
Method: Method2
Method: Equals
Method: GetHashCode
Method: GetType
Method: ToString
5. GetType方法
- GetType方法也会调用typeof运算符,该方法对么个类型的每个对象都有效。
// 使用GetType方法获取对象类型的名称
using System;
namespace Demo01
{
class SomeClass
{
}
class Program
{
static void Main()
{
SomeClass sm = new SomeClass();
Console.WriteLine($"{sm.GetType().Name}");
Console.ReadLine();
}
}
}
控制台输出:
SomeClass
6. nameof运算符
- nameof运算符返回用来表示变量、类型或者成员的字符串。
- nameof目前看不懂,后续再补充。
结尾
书籍:C#图解教程
著:【美】丹尼尔 · 索利斯;卡尔 · 施罗坦博尔
译:窦衍森;姚琪琳
ISBN:978-7-115-51918-4
版次:第5版
发行:人民邮电出版社
※敬请购买正版书籍,侵删请联系85863947@qq.com※
※本文章为看书或查阅资料而总结的笔记,仅供参考,如有错误请留言指正,谢谢!※

浙公网安备 33010602011771号