代码如下:
public string Name
        {
            get { return _name; }
            set    
            {
                if( value!= null && value.Length > 10)
                    throw new ArgumentOutOfRangeException("Invalid value for Name", value, value.ToString());
                
                _isChanged |= (_name != value);
                _name = value;
            }
        }此处为什么要这样写呢?_isChanged |= (_name != value);
直接给_name = value;就可以了么,为什么要在前一段加入_isChanged |= (_name != value);呢?

解决方案 »

  1.   

    MSDN如下说:| = 运算符请参见
    C# 运算符 | 7.13 赋值运算符
    “或”赋值运算符。lhs |= expr
    其中: lhs 
    存储位置、属性或索引器。 
    expr 
    一个表达式。 
    备注
    表达式使用 | = 赋值运算符,如x |= y
    等效于x = x | y
    不同的是 x 只被计算一次。| 运算符对整型操作数执行按位“或”操作,对布尔操作数执行逻辑“或”操作。| = 运算符不能被直接重载,但用户定义的类型可重载 | 运算符(请参见 operator)。示例
    // cs_operator_or_assignment.cs
    using System;
    class Test 
    {
       public static void Main() 
       {
          int a = 0x0c;
          a |= 0x06;
          Console.WriteLine("0x{0:x8}", a);
          bool b = true;
          b |= false;
          Console.WriteLine(b);
       }
    }
    输出
    0x0000000e
    True但是我没有明白为什么这样写
      

  2.   

    现在看来其实是个赋值,x   ¦=   y
    等效于
    x   =   x   ¦   y _isChanged   ¦=   (_name   !=   value); 其实就是给_isChanged赋值而已。
      

  3.   

    _isChanged   ¦=   (_name   !=   value); 
    -------------------
    为属性Name赋值时...如果新值与原值不同则将bool变量_isChanged置为true否则保持_isChanged原值..._isChanged也是个属性变量...这就是属性的好处...可以在赋值时进行逻辑处理...
      

  4.   

    具体它的作用就是通过IsChanged属性(应该是只读的)...判断该对象的数个属性值是否真的发生过改变...
      

  5.   

    “|=”是C#的一个复合赋值运算符,使用方法楼上都有了,类似的还有: ^=    %=    &=
      

  6.   

    这么做的目的很明显,可以随时查看_isChanged的值是true还是false来判断_name的值是否被改变过。
      

  7.   

    虽然x¦=y等效于x=x¦y...但¦=运算符中x只计算一次...其他赋值运算符也是如此...这里的_isChanged用到了¦=运算符说明在这个类中不只这里一处有这句代码...应该有数个属性的set访问器中都有类似语句...根据这个特点判断...这个类应该是用IsChanged属性来优化数据源更新的...即该类应该有个Save方法只有IsChanged为true时才做保存的动作...
      

  8.   

    虽然x¦=y等效于x=x¦y...但¦=运算符中x只计算一次...其他赋值运算符也是如此... 
    ==================================================================
    不同意这种说法,虽然源代码看起来好像不错,可编译后的IL代码是一样的。根本不会有任何效率提升。
      

  9.   

     _isChanged   ¦=   (_name   !=   value); 先判断name,value是否相等,结果是布尔制,true,false
    然后把结果与isChange做| 或 运算,结果付给isChange
      

  10.   

    虽然x¦=y等效于x=x¦y...但¦=运算符中x只计算一次...其他赋值运算符也是如此...   
    ================================================================== 
    不同意这种说法,虽然源代码看起来好像不错,可编译后的IL代码是一样的。根本不会有任何效率提升。----------------------------------------------------------------------------------------
    有效率提升,少打一个x~~以前C里面写C+=2编译后肯定是比C=C+2效率要高的,因为前者编译成汇编以后好像是mov 一下就OK了,但是后者不是这样的,貌似要压栈还是啥的,对汇编不懂,那位来解释一下。C#现在不是这样了?
      

  11.   

    我从C#入门经典上看好像A+=2和A=A+2效率是一样的。貌似最后的解释语言是一样的。
      

  12.   

    ====================MSDN=========================
    x |= y
    is equivalent tox = x | y
    except that x is only evaluated once. 
    ====================MSDN=========================only evaluated once...MSDN的官方解释...我也看过IL Code...确实是一样的...不过微软这么说应该有它的含义...