2010-04-14 13 views
6

¿Puede decirme qué tipo de constructo en C# es esto?¿Cómo se llama este tipo de encadenamiento en C#?

Code Golf: Numeric equivalent of an Excel column name

C.WriteLine(C.ReadLine() 
      .Reverse() 
      .Select((c, i) => (c - 64) * System.Math.Pow(26, i)) 
      .Sum()); 

Aunque soy nuevo en C# (sólo dos meses exp hasta ahora), pero desde el momento en que se han unido a un equipo de C#, nunca he visto este tipo de encadenamiento. Realmente me atrajo y quiero aprender más al respecto.

Por favor, den algunas ideas sobre esto.

+0

posible duplicado de http://stackoverflow.com/questions/1119799/method-chaining-in-c – Gishu

+0

@Thinking - ¿Qué versión de C# usa su equipo? – Kobi

+0

estamos usando 3.5 – Thinking

Respuesta

9

método de encadenamiento como esto a menudo se llama un fluent interface.

Puede crear su propia interfaz con fluidez mediante la implementación de funciones que devuelvan el objeto al que fueron llamados.

Para un ejemplo trivial:

class Foo 
{ 
    private int bar; 

    public Foo AddBar(int b) 
    { 
     bar += b; 
     return this; 
    } 
} 

que puede ser utilizado como:

Foo f = new Foo().AddBar(1).AddBar(2); 

También se puede implementar una interfaz fluida utilizando métodos de extensión.

Por ejemplo:

class Foo 
{ 
    public int Bar { get; set; } 
} 

static class FooExtensions 
{ 
    public static Foo AddBar(this Foo foo, int b) 
    { 
     foo.Bar += b; 
     return foo; 
    } 
} 

etc.

Here es un ejemplo más complejo. Finalmente, Autofac y CuttingEdge.Conditons son dos ejemplos de bibliotecas de código abierto que tienen muy buenas interfaces fluidas.

+0

es probable que signifique 'return this;' not not 'bar'. De cualquier manera, este no es exactamente el caso aquí, pero el concepto es lo suficientemente similar. – Kobi

+0

De hecho lo hice. Editado para arreglar eso, gracias Kobi. – MatthewKing

+0

Es probable que desee devolver un nuevo Foo con el resultado, para evitar efectos secundarios. –

2

La expresión no tiene nada de especial, pero el método select hace uso de lambda expressions, un componente clave de Language Integrated Query - LINQ, para abreviar.

.NET Language-Integrated Query define un conjunto de propósito general operadores estándar consulta que permitan recorrido, filtro, y las operaciones de proyección a expresarse en una forma declarativa directa sin embargo, en ningún basadas en .NET lenguaje de programación.

LINQ, y las expresiones lambda que utilizan, son una forma de escribir expresiones complicadas de consulta y manipulación de forma concisa y legible. Fue agregado a .NET Framework en 3.5. Aquí hay algunos more information from MSDN.

2

Es poco más que una cadena de llamadas a funciones con alguna sangría, donde C llama a ReadLine(), cuyo resultado se usa para Reversa, cuyo resultado se usa para Seleccionar, etc. Las funciones son parte de LINQ, las mismas que se usa después de traducir el azúcar sintáctico. Here's a list of LINQ query functions, along with samples on their use, y here's a tutorial for LINQ.

(En caso de que esté interesado: Reverse() devuelve un IEnumerable que va de atrás hacia adelante de lo dado IEnumerable, Select() devuelve un IEnumerable lista de todos los elementos, después de aplicar la expresión lambda dado, y Sum() simplemente devuelve la suma de todos los elementos del IEnumerable dado.)

1

El patrón de encadenamiento se puede llamar interfaz fluida. Se produce cuando la función de una interfaz (o método de extensión) devuelve la misma interfaz. En este caso, es IEnumerable.

También tienen algo de LINQ arrojado allí con las funciones Select y Sum

+0

No tiene que ser la misma interfaz. Ni siquiera tiene que ser una interfaz real. –

+0

Estrictamente hablando, 'IEnumerable ' y 'IEnumerable ' son no es la misma interfaz. Una interfaz fluida suele ser cuando las funciones finalizan con 'return this;', por lo que puede hacer 'Foo.Open(). Add (2) .Close();' en lugar de 'Foo.Open() ; Foo.Add (2); Foo.Close() '. LINQ devuelve un nuevo enumerable (tipo de), por lo que este es un encadenamiento normal. – Kobi

+0

No estoy de acuerdo, Kobi. Creo que nunca debes devolver 'esto', para evitar el lado -efectos –

Cuestiones relacionadas