☆C#的运算符定义只有四种形式:---------------------------------------
①public static 返回类型 operator ?(单形参)
②public static 返回类型 operator ?(双形参)
③public static implicit operator 隐转目标类型(单源类型形参)
④public static explicit operator 显转目标类型(单源类型形参)
△全部都是传值,故不可用ref和out参数
△全部都是static
△比较运算符的重载必须贯彻成对一起定义的原则来实现C#的一站式编码
△true()和false()也是运算符,分别表示 非(假/空)吗 和 非(真/空)吗
☆可重载的运算符以及解决方法可行性表(摘自vs.n中文正式版帮助):--------------------------------
运算符 可重载性
+, -, !, ~, ++, --, true(), false() 可以重载这些一元运算符。
+, -, *, /, %, &, | , ^, <<, >> 可以重载这些二进制运算符。
==, !=, <, >, <=, >=可以重载这些比较运算符(但必须成对重载)。
&&, ||不能重载条件逻辑运算符,但可使用 & 和 | 对其进行计算,可以重载 & 和 |;请参阅 7.11.2 用户定义的条件逻辑运算符。
[]不能重载数组索引运算符,但可定义索引器。
()不能重载转换运算符,但可定义新的转换运算符(请参阅 explicit 和 implicit)。
+=, -=, *=, /=, %=, &=, |=, ^=, <<=, >>=
不能重载赋值运算符,但例外的是可使用 +(该运算符可被重载)计算 +=。
=, ., ?:, ->, New, is, sizeof(), TypeOf()
不能重载这些运算符。
☆一些散题:-------------------------------------
①传递对象引用是传值的一种,不属于传址.因为对象的值只是实体的地址,如果传对象变量的地址才算是传址
②readonly比const宽松,因为也可以在构造器中赋值,此外【static readonly】<=>【const】
③using简化书写的其中一个功能就是创建〖姓或类型〗的别名,可减少修改
④using(IDispose化的对象〖,....〗){ }语句可以确保句尾调用对象.Dispose()
⑤代码和注释是最好的心得!
☆以下是C#运算符重载以及其他技巧的简单例子(摘自vs.n中文正式版帮助)--------------------------------
//版权所有 (C) 2000 Microsoft Corporation。保留所有权利。
// dbbool.cs
using System;
public struct DBBool
{
// 3 个可能的 DBBool 值:
public static readonly DBBool dbNull = new DBBool(0);
public static readonly DBBool dbFalse = new DBBool(-1);
public static readonly DBBool dbTrue = new DBBool(1);
// 为 dbFalse、dbNull、dbTrue 存储 -1、0、1 的私有字段:
int value;
// 私有构造函数。值参数必须为 -1、0 或 1:
DBBool(int value)
{
this.value = value;
}
// 从 bool 到 DBBool 的隐式转换。将 true 映射为
// DBBool.dbTrue,并将 false 映射为 DBBool.dbFalse:
public static implicit operator DBBool(bool x)
{
return x? dbTrue: dbFalse;
}
// 从 DBBool 到 bool 的显式转换。如果
// 给定的 DBBool 为 dbNull,则引发异常,否则返回
// true 或 false:
public static explicit operator bool(DBBool x)
{
if (x.value == 0) throw new InvalidOperationException();
return x.value > 0;
}
// 相等运算符。如果任何一个操作数为 dbNull,则返回 dbNull,
// 否则返回 dbTrue 或 dbFalse:
public static DBBool operator ==(DBBool x, DBBool y)
{
if (x.value == 0 || y.value == 0) return dbNull;
return x.value == y.value? dbTrue: dbFalse;
}
// 不等运算符。如果任何一个操作数为
// dbNull,则返回 dbNull,否则返回 dbTrue 或 dbFalse:
public static DBBool operator !=(DBBool x, DBBool y)
{
if (x.value == 0 || y.value == 0) return dbNull;
return x.value != y.value? dbTrue: dbFalse;
}
// 逻辑非运算符。如果操作数为
// dbFalse,则返回 dbTrue,如果操作数为 dbNull,则返回 dbNull,如果
// 操作数为 dbTrue,则返回 dbFalse:
public static DBBool operator !(DBBool x)
{
return new DBBool(-x.value);
}
// 逻辑 AND 运算符。如果任何一个操作数为
// dbFalse,则返回 dbFalse,如果任何一个操作数为 dbNull,则返回 dbNull,否则返回 dbTrue:
public static DBBool operator &(DBBool x, DBBool y)
{
return new DBBool(x.value < y.value? x.value: y.value);
}
// 逻辑 OR 运算符。如果任何一个操作数为
// dbTrue,则返回 dbTrue,如果任何一个操作数为 dbNull,则返回 dbNull,否则返回 dbFalse:
public static DBBool operator |(DBBool x, DBBool y)
{
return new DBBool(x.value > y.value? x.value: y.value);
}
// 绝对真运算符。如果操作数为
// dbTrue,则返回 true,否则返回 false:
public static bool operator true(DBBool x)
{
return x.value > 0;
}
// 绝对假运算符。如果操作数为
// dbFalse,则返回 true,否则返回 false:
public static bool operator false(DBBool x)
{
return x.value < 0;
}
// 重载从 DBBool 到 string 的转换:
public static implicit operator string(DBBool x)
{
return x.value > 0 ? "dbTrue"
: x.value < 0 ? "dbFalse"
: "dbNull";
}
// 重写 Object.Equals(object o) 方法:
public override bool Equals(object o)
{
try
{
return (bool) (this == (DBBool) o);
}
catch
{
return false;
}
}
// 重写 Object.GetHashCode() 方法:
public override int GetHashCode()
{
return value;
}
// 重写 ToString 方法以便将 DBBool 转换为 string:
public override string ToString()
{
switch (value)
{
case -1:
return "DBBool.False";
case 0:
return "DBBool.Null";
case 1:
return "DBBool.True";
default:
throw new InvalidOperationException();
}
}
}
class Test
{
static void Main()
{
DBBool a, b;
a = DBBool.dbTrue;
b = DBBool.dbNull;
Console.WriteLine( "!{0} = {1}", a, !a);
Console.WriteLine( "!{0} = {1}", b, !b);
Console.WriteLine( "{0} & {1} = {2}", a, b, a & b);
Console.WriteLine( "{0} | {1} = {2}", a, b, a | b);
// 调用真运算符以确定 DBBool 变量的
// 布尔值:
if (b)
Console.WriteLine("b is definitely true");
else
Console.WriteLine("b is not definitely true");
}
}
分享到:
相关推荐
c#运算符和表达式课件,c#运算符和表达式课件,c#运算符和表达式课件,c#运算符和表达式课件,
C#运算符优先级解释
C#运算符大全C#运算符大全C#运算符大全
c# 运算符号大全,一个齐全的c#运算符号大全。。。
c#运算符和控制流,仿照大神做的一个思维导图文件,分享给大家
Microsoft SQL和C#的运算符及对比
C# 运算符都在这里了!!!.md
C#运算符(新)[归纳].pdf
具体介绍c#的数据类型、运算符和表达式等等
该文档是对开发技术 C#做了简单的介绍,使我们对其有了一些简单认识与了解,教会了我们它的思想,与它的语法。
C#运算符重载的含义、应用
运算符+ - * / % ++ -- 关系运算符>,<,>=,,==,!= 逻辑运算符&&与 ||或 !非 赋值运算符=、+=、-=、*=、/=、%= 三目(三元)运算符 格式:判断条件 ? "正确输出" : "错误输出
C# 面向对象编程时,内部各种运算符,包括,+,-,*,%,!,@,::,',",>>,,^,|,&,||等数十种运算符的使用
C#-运算符-OperatorsAppl
主要介绍了C#运算符和表达式,这是自学C#编程的第五篇,希望对大家的学习有所帮助。
主要介绍了c# 运算符重载的相关资料,文中讲解非常细致,代码帮助大家更好的理解和学习,感兴趣的朋友可以了解下
主要介绍了C#运算符重载用法,实例分析了C#中运算符重载的基本实现与使用技巧,需要的朋友可以参考下
空结合运算符的介绍和实例演示,定义一个变量,指定常量定义符是什么
本文较为详细的描述了重载运算符的方法。一般来说,重载运算符在实际的项目开发中会经常的用到,但如果...C#中的两个字符串相加,实际上是连接两个字符串,假如有两个EmployeeDetail类型相加得到一个EmployeeCollect