首页 > 开发 > 综合 > 正文

整理一下运算符资料

2024-07-21 02:22:15
字体:
来源:转载
供稿:网友
    ☆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");   
   }
}


  • 网站运营seo文章大全
  • 提供全面的站长运营经验及seo技术!
  • 发表评论 共有条评论
    用户名: 密码:
    验证码: 匿名发表