<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ru">
		<id>http://nfex.ru/index.php?action=history&amp;feed=atom&amp;title=Csharp%2FCSharp_Tutorial%2FOperator_Overload%2Foperator_overload</id>
		<title>Csharp/CSharp Tutorial/Operator Overload/operator overload - История изменений</title>
		<link rel="self" type="application/atom+xml" href="http://nfex.ru/index.php?action=history&amp;feed=atom&amp;title=Csharp%2FCSharp_Tutorial%2FOperator_Overload%2Foperator_overload"/>
		<link rel="alternate" type="text/html" href="http://nfex.ru/index.php?title=Csharp/CSharp_Tutorial/Operator_Overload/operator_overload&amp;action=history"/>
		<updated>2026-04-30T05:47:43Z</updated>
		<subtitle>История изменений этой страницы в вики</subtitle>
		<generator>MediaWiki 1.30.0</generator>

	<entry>
		<id>http://nfex.ru/index.php?title=Csharp/CSharp_Tutorial/Operator_Overload/operator_overload&amp;diff=6382&amp;oldid=prev</id>
		<title> в 15:31, 26 мая 2010</title>
		<link rel="alternate" type="text/html" href="http://nfex.ru/index.php?title=Csharp/CSharp_Tutorial/Operator_Overload/operator_overload&amp;diff=6382&amp;oldid=prev"/>
				<updated>2010-05-26T15:31:53Z</updated>
		
		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;table class=&quot;diff diff-contentalign-left&quot; data-mw=&quot;interface&quot;&gt;
				&lt;tr style=&quot;vertical-align: top;&quot; lang=&quot;ru&quot;&gt;
				&lt;td colspan=&quot;1&quot; style=&quot;background-color: white; color:black; text-align: center;&quot;&gt;← Предыдущая&lt;/td&gt;
				&lt;td colspan=&quot;1&quot; style=&quot;background-color: white; color:black; text-align: center;&quot;&gt;Версия 15:31, 26 мая 2010&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; style=&quot;text-align: center;&quot; lang=&quot;ru&quot;&gt;&lt;div class=&quot;mw-diff-empty&quot;&gt;(нет различий)&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;</summary>
			</entry>

	<entry>
		<id>http://nfex.ru/index.php?title=Csharp/CSharp_Tutorial/Operator_Overload/operator_overload&amp;diff=6383&amp;oldid=prev</id>
		<title>Admin: 1 версия</title>
		<link rel="alternate" type="text/html" href="http://nfex.ru/index.php?title=Csharp/CSharp_Tutorial/Operator_Overload/operator_overload&amp;diff=6383&amp;oldid=prev"/>
				<updated>2010-05-26T12:18:53Z</updated>
		
		<summary type="html">&lt;p&gt;1 версия&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Новая страница&lt;/b&gt;&lt;/p&gt;&lt;div&gt;==A better way to overload !, |, and &amp;amp; for TwoDimension.==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;This version automatically enables the &amp;amp;&amp;amp; and || operators.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
   &lt;br /&gt;
&amp;lt;source lang=&amp;quot;csharp&amp;quot;&amp;gt;using System;   &lt;br /&gt;
   &lt;br /&gt;
class TwoDimension {   &lt;br /&gt;
  int x, y;&lt;br /&gt;
   &lt;br /&gt;
  public TwoDimension() { &lt;br /&gt;
     x = y = 0; &lt;br /&gt;
  }   &lt;br /&gt;
  public TwoDimension(int i, int j) { &lt;br /&gt;
     x = i; &lt;br /&gt;
     y = j;&lt;br /&gt;
  }   &lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
  // Overload | for short-circuit evaluation.   &lt;br /&gt;
  public static TwoDimension operator |(TwoDimension op1, TwoDimension op2)   &lt;br /&gt;
  {  &lt;br /&gt;
    if( ((op1.x != 0) || (op1.y != 0) ) | &lt;br /&gt;
       ((op2.x != 0) || (op2.y != 0)) ) &lt;br /&gt;
      return new TwoDimension(1, 1);   &lt;br /&gt;
    else   &lt;br /&gt;
      return new TwoDimension(0, 0);   &lt;br /&gt;
  }   &lt;br /&gt;
 &lt;br /&gt;
  // Overload &amp;amp; for short-circuit evaluation.   &lt;br /&gt;
  public static TwoDimension operator &amp;amp;(TwoDimension op1, TwoDimension op2)   &lt;br /&gt;
  {   &lt;br /&gt;
    if( ((op1.x != 0) &amp;amp;&amp;amp; (op1.y != 0)) &amp;amp; &lt;br /&gt;
       ((op2.x != 0) &amp;amp;&amp;amp; (op2.y != 0) ) ) &lt;br /&gt;
      return new TwoDimension(1, 1);   &lt;br /&gt;
    else   &lt;br /&gt;
      return new TwoDimension(0, 0);   &lt;br /&gt;
  }   &lt;br /&gt;
 &lt;br /&gt;
  // Overload !.   &lt;br /&gt;
  public static bool operator !(TwoDimension op)   &lt;br /&gt;
  {   &lt;br /&gt;
    if(op) return false;   &lt;br /&gt;
    else return true;   &lt;br /&gt;
  }   &lt;br /&gt;
 &lt;br /&gt;
  // Overload true.   &lt;br /&gt;
  public static bool operator true(TwoDimension op) { &lt;br /&gt;
    if((op.x != 0) || (op.y != 0)) &lt;br /&gt;
      return true; // at least one coordinate is non-zero &lt;br /&gt;
    else &lt;br /&gt;
      return false; &lt;br /&gt;
  }   &lt;br /&gt;
 &lt;br /&gt;
  // Overload false. &lt;br /&gt;
  public static bool operator false(TwoDimension op) { &lt;br /&gt;
    if((op.x == 0) &amp;amp;&amp;amp; (op.y == 0)) &lt;br /&gt;
      return true; // all coordinates are zero &lt;br /&gt;
    else &lt;br /&gt;
      return false; &lt;br /&gt;
  }   &lt;br /&gt;
 &lt;br /&gt;
  // Show X, Y&lt;br /&gt;
  public void show()   &lt;br /&gt;
  {   &lt;br /&gt;
    Console.WriteLine(x + &amp;quot;, &amp;quot; + y);   &lt;br /&gt;
  }   &lt;br /&gt;
}   &lt;br /&gt;
   &lt;br /&gt;
class MainClass {   &lt;br /&gt;
  public static void Main() {   &lt;br /&gt;
    TwoDimension a = new TwoDimension(5, 6);   &lt;br /&gt;
    TwoDimension b = new TwoDimension(10, 10);   &lt;br /&gt;
    TwoDimension c = new TwoDimension(0, 0);   &lt;br /&gt;
   &lt;br /&gt;
    Console.Write(&amp;quot;Here is a: &amp;quot;);   &lt;br /&gt;
    a.show();   &lt;br /&gt;
    Console.Write(&amp;quot;Here is b: &amp;quot;);   &lt;br /&gt;
    b.show();   &lt;br /&gt;
    Console.Write(&amp;quot;Here is c: &amp;quot;);   &lt;br /&gt;
    c.show();   &lt;br /&gt;
    Console.WriteLine();   &lt;br /&gt;
   &lt;br /&gt;
    if(a) {&lt;br /&gt;
       Console.WriteLine(&amp;quot;a is true.&amp;quot;); &lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    if(b) {&lt;br /&gt;
        Console.WriteLine(&amp;quot;b is true.&amp;quot;); &lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    if(c) {&lt;br /&gt;
        Console.WriteLine(&amp;quot;c is true.&amp;quot;); &lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
 &lt;br /&gt;
    if(!a) {&lt;br /&gt;
       Console.WriteLine(&amp;quot;a is false.&amp;quot;); &lt;br /&gt;
    }&lt;br /&gt;
    if(!b) {&lt;br /&gt;
       Console.WriteLine(&amp;quot;b is false.&amp;quot;); &lt;br /&gt;
    }&lt;br /&gt;
    if(!c) {&lt;br /&gt;
       Console.WriteLine(&amp;quot;c is false.&amp;quot;); &lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
    Console.WriteLine(); &lt;br /&gt;
 &lt;br /&gt;
    Console.WriteLine(&amp;quot;Use &amp;amp; and |&amp;quot;); &lt;br /&gt;
    if(a &amp;amp; b) &lt;br /&gt;
       Console.WriteLine(&amp;quot;a &amp;amp; b is true.&amp;quot;); &lt;br /&gt;
    else &lt;br /&gt;
       Console.WriteLine(&amp;quot;a &amp;amp; b is false.&amp;quot;); &lt;br /&gt;
 &lt;br /&gt;
    if(a &amp;amp; c) &lt;br /&gt;
       Console.WriteLine(&amp;quot;a &amp;amp; c is true.&amp;quot;); &lt;br /&gt;
    else &lt;br /&gt;
       Console.WriteLine(&amp;quot;a &amp;amp; c is false.&amp;quot;); &lt;br /&gt;
 &lt;br /&gt;
    if(a | b) &lt;br /&gt;
       Console.WriteLine(&amp;quot;a | b is true.&amp;quot;); &lt;br /&gt;
    else &lt;br /&gt;
       Console.WriteLine(&amp;quot;a | b is false.&amp;quot;); &lt;br /&gt;
 &lt;br /&gt;
    if(a | c) &lt;br /&gt;
       Console.WriteLine(&amp;quot;a | c is true.&amp;quot;); &lt;br /&gt;
    else &lt;br /&gt;
       Console.WriteLine(&amp;quot;a | c is false.&amp;quot;); &lt;br /&gt;
 &lt;br /&gt;
    Console.WriteLine(); &lt;br /&gt;
 &lt;br /&gt;
    // now use short-circuit ops &lt;br /&gt;
    Console.WriteLine(&amp;quot;Use short-circuit &amp;amp;&amp;amp; and ||&amp;quot;); &lt;br /&gt;
    if(a &amp;amp;&amp;amp; b) &lt;br /&gt;
        Console.WriteLine(&amp;quot;a &amp;amp;&amp;amp; b is true.&amp;quot;); &lt;br /&gt;
    else &lt;br /&gt;
        Console.WriteLine(&amp;quot;a &amp;amp;&amp;amp; b is false.&amp;quot;); &lt;br /&gt;
 &lt;br /&gt;
    if(a &amp;amp;&amp;amp; c) &lt;br /&gt;
        Console.WriteLine(&amp;quot;a &amp;amp;&amp;amp; c is true.&amp;quot;); &lt;br /&gt;
    else &lt;br /&gt;
        Console.WriteLine(&amp;quot;a &amp;amp;&amp;amp; c is false.&amp;quot;); &lt;br /&gt;
 &lt;br /&gt;
    if(a || b) &lt;br /&gt;
        Console.WriteLine(&amp;quot;a || b is true.&amp;quot;); &lt;br /&gt;
    else &lt;br /&gt;
        Console.WriteLine(&amp;quot;a || b is false.&amp;quot;); &lt;br /&gt;
 &lt;br /&gt;
    if(a || c) &lt;br /&gt;
        Console.WriteLine(&amp;quot;a || c is true.&amp;quot;); &lt;br /&gt;
    else &lt;br /&gt;
        Console.WriteLine(&amp;quot;a || c is false.&amp;quot;); &lt;br /&gt;
  }   &lt;br /&gt;
}&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;pre class=codeResult&amp;gt;Here is a: 5, 6&lt;br /&gt;
Here is b: 10, 10&lt;br /&gt;
Here is c: 0, 0&lt;br /&gt;
a is true.&lt;br /&gt;
b is true.&lt;br /&gt;
c is false.&lt;br /&gt;
Use &amp;amp; and |&lt;br /&gt;
a &amp;amp; b is true.&lt;br /&gt;
a &amp;amp; c is false.&lt;br /&gt;
a | b is true.&lt;br /&gt;
a | c is true.&lt;br /&gt;
Use short-circuit &amp;amp;&amp;amp; and ||&lt;br /&gt;
a &amp;amp;&amp;amp; b is true.&lt;br /&gt;
a &amp;amp;&amp;amp; c is false.&lt;br /&gt;
a || b is true.&lt;br /&gt;
a || c is true.&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Operator Overloading: A Complex Number Class==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;OL&amp;gt;&amp;lt;LI&amp;gt;If you overload the == operator, then you need to override Equals(object) and GetHashCode().&amp;lt;/LI&amp;gt;&amp;lt;LI&amp;gt;The == operator and the Equals(object) methods should function the same way.&amp;lt;/LI&amp;gt;&amp;lt;/OL&amp;gt;&lt;br /&gt;
&amp;lt;OL&amp;gt;&amp;lt;LI&amp;gt;When Equals() is overridden, you should also override GetHashCode().&amp;lt;/LI&amp;gt;&amp;lt;LI&amp;gt;Equals() and GetHashCode should be compatible.&amp;lt;/LI&amp;gt;&amp;lt;/OL&amp;gt;&lt;br /&gt;
&lt;br /&gt;
   &lt;br /&gt;
&amp;lt;source lang=&amp;quot;csharp&amp;quot;&amp;gt;using System;&lt;br /&gt;
struct Complex&lt;br /&gt;
{&lt;br /&gt;
    float real;&lt;br /&gt;
    float imaginary;&lt;br /&gt;
    &lt;br /&gt;
    public Complex(float real, float imaginary)&lt;br /&gt;
    {&lt;br /&gt;
        this.real = real;&lt;br /&gt;
        this.imaginary = imaginary;&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    public float Real&lt;br /&gt;
    {&lt;br /&gt;
        get&lt;br /&gt;
        {&lt;br /&gt;
            return(real);&lt;br /&gt;
        }&lt;br /&gt;
        set&lt;br /&gt;
        {&lt;br /&gt;
            real = value;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    public float Imaginary&lt;br /&gt;
    {&lt;br /&gt;
        get&lt;br /&gt;
        {&lt;br /&gt;
            return(imaginary);&lt;br /&gt;
        }&lt;br /&gt;
        set&lt;br /&gt;
        {&lt;br /&gt;
            imaginary = value;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    public override string ToString()&lt;br /&gt;
    {&lt;br /&gt;
        return(String.Format(&amp;quot;({0}, {1}i)&amp;quot;, real, imaginary));&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    public static bool operator==(Complex c1, Complex c2)&lt;br /&gt;
    {&lt;br /&gt;
        if ((c1.real == c2.real) &amp;amp;&amp;amp; (c1.imaginary == c2.imaginary))&lt;br /&gt;
           return(true);&lt;br /&gt;
        else&lt;br /&gt;
           return(false);&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    public static bool operator!=(Complex c1, Complex c2)&lt;br /&gt;
    {&lt;br /&gt;
        return(!(c1 == c2));&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    public override bool Equals(object o2)&lt;br /&gt;
    {&lt;br /&gt;
        Complex c2 = (Complex) o2;&lt;br /&gt;
        &lt;br /&gt;
        return(this == c2);&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    public override int GetHashCode()&lt;br /&gt;
    {&lt;br /&gt;
        return(real.GetHashCode() ^ imaginary.GetHashCode());&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    public static Complex operator+(Complex c1, Complex c2)&lt;br /&gt;
    {&lt;br /&gt;
        return(new Complex(c1.real + c2.real, c1.imaginary + c2.imaginary));&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    public static Complex operator-(Complex c1, Complex c2)&lt;br /&gt;
    {&lt;br /&gt;
        return(new Complex(c1.real - c2.real, c1.imaginary - c2.imaginary));&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    public static Complex operator*(Complex c1, Complex c2)&lt;br /&gt;
    {&lt;br /&gt;
        return(new Complex(c1.real * c2.real - c1.imaginary * c2.imaginary,&lt;br /&gt;
        c1.real * c2.imaginary + c2.real * c1.imaginary));&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    public static Complex operator/(Complex c1, Complex c2)&lt;br /&gt;
    {&lt;br /&gt;
        if ((c2.real == 0.0f) &amp;amp;&amp;amp; (c2.imaginary == 0.0f))&lt;br /&gt;
           throw new DivideByZeroException(&amp;quot;Can&amp;quot;t divide by zero Complex number&amp;quot;);&lt;br /&gt;
        &lt;br /&gt;
        float newReal = (c1.real * c2.real + c1.imaginary * c2.imaginary) / (c2.real * c2.real + c2.imaginary * c2.imaginary);&lt;br /&gt;
        float newImaginary = (c2.real * c1.imaginary - c1.real * c2.imaginary) / (c2.real * c2.real + c2.imaginary * c2.imaginary);&lt;br /&gt;
        &lt;br /&gt;
        return(new Complex(newReal, newImaginary));&lt;br /&gt;
    }&lt;br /&gt;
  &lt;br /&gt;
}&lt;br /&gt;
class MainClass&lt;br /&gt;
{&lt;br /&gt;
    public static void Main()&lt;br /&gt;
    {&lt;br /&gt;
        Complex c1 = new Complex(3, 1);&lt;br /&gt;
        Complex c2 = new Complex(1, 2);&lt;br /&gt;
        &lt;br /&gt;
        Console.WriteLine(&amp;quot;c1 == c2: {0}&amp;quot;, c1 == c2);&lt;br /&gt;
        Console.WriteLine(&amp;quot;c1 != c2: {0}&amp;quot;, c1 != c2);&lt;br /&gt;
        Console.WriteLine(&amp;quot;c1 + c2 = {0}&amp;quot;, c1 + c2);&lt;br /&gt;
        Console.WriteLine(&amp;quot;c1 - c2 = {0}&amp;quot;, c1 - c2);&lt;br /&gt;
        Console.WriteLine(&amp;quot;c1 * c2 = {0}&amp;quot;, c1 * c2);&lt;br /&gt;
        Console.WriteLine(&amp;quot;c1 / c2 = {0}&amp;quot;, c1 / c2);&lt;br /&gt;
    }&lt;br /&gt;
}&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;pre class=codeResult&amp;gt;c1 == c2: False&lt;br /&gt;
c1 != c2: True&lt;br /&gt;
c1 + c2 = (4, 3i)&lt;br /&gt;
c1 - c2 = (2, -1i)&lt;br /&gt;
c1 * c2 = (1, 7i)&lt;br /&gt;
c1 / c2 = (1, -1i)&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Operator Overloading for your own class==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
   &lt;br /&gt;
&amp;lt;source lang=&amp;quot;csharp&amp;quot;&amp;gt;using System;&lt;br /&gt;
struct MyType&lt;br /&gt;
{&lt;br /&gt;
    public MyType(int value)&lt;br /&gt;
    {&lt;br /&gt;
        this.value = value;&lt;br /&gt;
    }&lt;br /&gt;
    public override string ToString()&lt;br /&gt;
    {&lt;br /&gt;
        return(value.ToString());&lt;br /&gt;
    }&lt;br /&gt;
    public static MyType operator -(MyType roman)&lt;br /&gt;
    {&lt;br /&gt;
        return(new MyType(-roman.value));&lt;br /&gt;
    }&lt;br /&gt;
    public static MyType operator +( MyType roman1, MyType roman2)&lt;br /&gt;
    {&lt;br /&gt;
        return(new MyType(roman1.value + roman2.value));&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    public static MyType operator ++(MyType roman)&lt;br /&gt;
    {&lt;br /&gt;
        return(new MyType(roman.value + 1));&lt;br /&gt;
    }&lt;br /&gt;
    int value;&lt;br /&gt;
}&lt;br /&gt;
class MainClass&lt;br /&gt;
{&lt;br /&gt;
    public static void Main()&lt;br /&gt;
    {&lt;br /&gt;
        MyType    roman1 = new MyType(12);&lt;br /&gt;
        MyType    roman2 = new MyType(125);&lt;br /&gt;
        &lt;br /&gt;
        Console.WriteLine(&amp;quot;Increment: {0}&amp;quot;, roman1++);&lt;br /&gt;
        Console.WriteLine(&amp;quot;Increment: {0}&amp;quot;, roman1++);&lt;br /&gt;
        &lt;br /&gt;
        Console.WriteLine(&amp;quot;Addition: {0}&amp;quot;, roman1 + roman2);&lt;br /&gt;
        Console.WriteLine(&amp;quot;Addition: {0}&amp;quot;, roman1++ + roman2++);&lt;br /&gt;
        &lt;br /&gt;
    }&lt;br /&gt;
}&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;pre class=codeResult&amp;gt;Increment: 12&lt;br /&gt;
Increment: 13&lt;br /&gt;
Addition: 139&lt;br /&gt;
Addition: 139&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Valid Overloadable Operators==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
   &lt;br /&gt;
&amp;lt;source lang=&amp;quot;csharp&amp;quot;&amp;gt;C# Operator                                    Overloadability&lt;br /&gt;
+, -, !, ~, ++, --, true, false                This set of unary operators can be overloaded.&lt;br /&gt;
+, -, *, /, %, &amp;amp;, |, ^, &amp;lt;&amp;lt;, &amp;gt;&amp;gt;                 These binary operators can be overloaded.&lt;br /&gt;
==, !=, &amp;lt;, &amp;gt;, &amp;lt;=, &amp;gt;=                           The comparison operators can be overloaded. &lt;br /&gt;
[]                                             The [] operator cannot be overloaded. &lt;br /&gt;
()                                             The () operator cannot be overloaded. &lt;br /&gt;
+=, -=, *=, /=, %=, &amp;amp;=, |=, ^=, &amp;lt;&amp;lt;=, &amp;gt;&amp;gt;=       Shorthand assignment operators cannot be overloaded.&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Admin</name></author>	</entry>

	</feed>