C sobrecarga # operador
Você pode redefinir ou substituir o operador de built-in C #. Portanto, os programadores podem usar os operadores de tipo definido pelo usuário. operadores sobrecarregados estão tendo um nome de função especial, seguida pelooperador palavra-chave definição do símbolo do operador.E outras funções, operadores sobrecarregados tem um tipo de retorno e lista de parâmetros.
Por exemplo, considere a seguinte função:
público operador Box estática + (Box b, Box c) { caixa = new Box (); box.length = b.length + c.length; box.breadth = b.breadth + c.breadth; box.height = b.height + c.height; caixa de retornar; }
A função acima é Box classe definida pelo usuário implementa o operador de adição (+). É a propriedade de dois objetos de caixa são adicionados, e os objetos de retorno de caixa adicional.
Sobrecarga de operador para conseguir
O programa a seguir demonstra a implementação completa:
using System; OperatorOvlApplication namespace { classe Box { comprimento duplo privado; // comprimento largura dupla privado; // largura altura dupla privado; // altura public double getVolume () { comprimento de retorno * largura * altura; } SetLength public void (duplo len) { length = len; } setBreadth public void (double BRE) { largura = bre; } setHeight public void (double hei) { height = hei; } // Sobrecarregado + operador à soma dos dois Box objetos operador Box public static + (Box b, Box c) { caixa = new Box (); box.length = b.length + c.length; box.breadth = b.breadth + c.breadth; box.height = b.height + c.height; caixa de retornar; } } Tester classe { static void Main (string [] args) { Box Box1 = new Box (); // declara Box1, tipo Box Box Box2 = new Box (); // declara Box2, tipo Box Box Box3 = new Box (); // declara Box3, tipo Box double volume = 0,0; // // Box1 volume de detalhamento Box1.setLength (6,0); Box1.setBreadth (7,0); Box1.setHeight (5.0); // Box2 detalhando Box2.setLength (12,0); Box2.setBreadth (13,0); Box2.setHeight (10,0); // Volume de Box1 de volume = Box1.getVolume (); Console.WriteLine ( "volume de Box1: {0}", volume); // Volume de Box2 de volume = Box2.getVolume (); Console.WriteLine ( "volume de Box2: {0}", volume); // Os dois objetos são adicionados Box3 = Box1 + Box2; // Volume de Box3 de volume = Box3.getVolume (); Console.WriteLine ( "volume de Box3: {0}", volume); Console.ReadKey (); } } }
Quando o código acima é compilado e executado, ele produz os seguintes resultados:
volume de Box1: 210 volume de box2: 1560 volume de Box3: 5400
operadores recarregáveis e não-sobrecarregada
A tabela a seguir descreve a capacidade da sobrecarga C # operator:
运算符 | 描述 |
---|---|
+, -, !, ~, ++, -- | 这些一元运算符只有一个操作数,且可以被重载。 |
+, -, *, /, % | 这些二元运算符带有两个操作数,且可以被重载。 |
==, !=, <, >, <=, >= | 这些比较运算符可以被重载。 |
&&, || | 这些条件逻辑运算符不能被直接重载。 |
+=, -=, *=, /=, %= | 这些赋值运算符不能被重载。 |
=, ., ?:, ->, new, is, sizeof, typeof | 这些运算符不能被重载。 |
Exemplos
Para a discussão acima, vamos estender o exemplo acima, os operadores mais sobrecarregados:
using System; OperatorOvlApplication namespace { classe Box { comprimento duplo privado; // comprimento largura dupla privado; // largura altura dupla privado; // altura public double getVolume () { comprimento de retorno * largura * altura; } SetLength public void (duplo len) { length = len; } setBreadth public void (double BRE) { largura = bre; } setHeight public void (double hei) { height = hei; } // Sobrecarregado + operador à soma dos dois Box objetos operador Box public static + (Box b, Box c) { caixa = new Box (); box.length = b.length + c.length; box.breadth = b.breadth + c.breadth; box.height = b.height + c.height; caixa de retornar; } == Operador bool static (LHS Box, rhs Box) { estatuto bool = false; if (lhs.length == rhs.length && lhs.height == rhs.height && Lhs.breadth == rhs.breadth) { status = true; } status de retorno; } operador bool public static! = (LHS Box, rhs Box) { estatuto bool = false; Se (lhs.length! = rhs.length || lhs.height! = rhs.height || Lhs.breadth! = Rhs.breadth) { status = true; } status de retorno; } operador bool public static <(LHS Box, rhs Box) { estatuto bool = false; if (lhs.length <rhs.length && lhs.height <Rhs.height && lhs.breadth <rhs.breadth) { status = true; } status de retorno; } operador bool public static> (LHS Box, rhs Box) { estatuto bool = false; if (lhs.length> rhs.length && lhs.height > Rhs.height && lhs.breadth> rhs.breadth) { status = true; } status de retorno; } operador bool public static <= (LHS Box, rhs Box) { estatuto bool = false; if (lhs.length <= rhs.length && lhs.height <= Rhs.height && lhs.breadth <= rhs.breadth) { status = true; } status de retorno; } operador bool public static> = (LHS Box, RHS Box) { estatuto bool = false; if (lhs.length> = rhs.length && lhs.height > = Rhs.height && lhs.breadth> = rhs.breadth) { status = true; } status de retorno; } public override ToString string () { voltar String.Format ( "({0}, {1}, {2})", comprimento, largura, altura); } } Tester classe { static void Main (string [] args) { Box Box1 = new Box (); // declara Box1, tipo Box Box Box2 = new Box (); // declara Box2, tipo Box Box Box3 = new Box (); // declara Box3, tipo Box Box Box4 = new Box (); double volume = 0,0; // // Box1 volume de detalhamento Box1.setLength (6,0); Box1.setBreadth (7,0); Box1.setHeight (5.0); // Box2 detalhando Box2.setLength (12,0); Box2.setBreadth (13,0); Box2.setHeight (10,0); // Use o ToString sobrecarregado () exibe duas caixas Console.WriteLine ( "Box1: {0}", Box1.ToString ()); Console.WriteLine ( "Box2: {0}", Box2.ToString ()); // Volume de Box1 de volume = Box1.getVolume (); Console.WriteLine ( "volume de Box1: {0}", volume); // Volume de Box2 de volume = Box2.getVolume (); Console.WriteLine ( "volume de Box2: {0}", volume); // Os dois objetos são adicionados Box3 = Box1 + Box2; Console.WriteLine ( "Box3: {0}", Box3.ToString ()); // Volume de Box3 de volume = Box3.getVolume (); Console.WriteLine ( "volume de Box3: {0}", volume); // Comparando as caixas Se (Box1> Box2) Console.WriteLine ( "Box1 superior a Box2"); mais Console.WriteLine ( "box1 não mais de Box2"); Se (Box1 <Box2) Console.WriteLine ( "Box1 inferior a Box2"); mais Console.WriteLine ( "BOX1 não inferior a Box2"); Se (Box1> = Box2) Console.WriteLine ( "Box1 maior do que ou igual Box2"); mais Console.WriteLine ( "BOX1 não é maior do que ou igual Box2"); Se (Box1 <= Box2) Console.WriteLine ( "Box1 menos Box2"); mais Console.WriteLine ( "Box1 não menos Box2"); Se (Box1! = Box2) Console.WriteLine ( "Box1 não igual a Box2"); mais Console.WriteLine ( "Box1 igual Box2"); Box4 = Box3; if (Box3 == Box4) Console.WriteLine ( "Box3 igual Box4"); mais Console.WriteLine ( "Box3 não é igual Box4"); Console.ReadKey (); } } }
Quando o código acima é compilado e executado, ele produz os seguintes resultados:
Caixa1: (6, 7, 5) Box2: (12, 13, 10) volume de Box1: 210 volume de box2: 1560 Box3: (18, 20, 15) volume de Box3: 5400 Box1 Box2 não mais de Caixa1 Box2 inferior Caixa1 Box2 não é maior do que ou igual Box1 Box2 menos Caixa1 Box2 não igual Box3 igual Box4