2009-06-24 7 views
10

Lo siento por lo que es probablemente una pregunta tonta, pero me está molestando ...¿Por qué los métodos Array no están integrados en una instancia de Array?

int[] i = {3, 2, 1}; 
//why 
Array.Sort(i); 
//instead of 
i.Sort(); 

char c = 'c'; 
//why 
char.IsLetter(c); 
//instead of 
c.Isletter(); 
+1

Vaya, tantas respuestas incorrectas. – VVS

+2

¿Tiene la correcta? Publícalo. –

+2

Esta pregunta es muy similar a http://stackoverflow.com/questions/389257/why-is-dotnets-char-islower-a-static-method. –

Respuesta

1

Usted puede hacerlo por sí mismo si utiliza .NET 3.0, utilizando los métodos de extensión:

public static class Extensions 
{ 
public static bool IsLetter(this chr) 
{ 
return char.IsLetter(chr); 
} 
} 

luego llamar es como: c.IsLetter()

O haga la forma que desee. Lo mismo al ordenar

1

Es una decisión de implementación. No sé qué estaba pasando todo por las cabezas del diseñador de marcos, pero creo que una de las razones es permitir ordenar una gran variedad de tipos personalizados con el mínimo esfuerzo.

Cualquier clase que implemente iComparable se puede poner en una matriz y ordenar. Si fuera un método de la matriz, entonces tendría que escribir un nuevo tipo de matriz para mi tipo personalizado.

Además, como otros señalaron, los tipos primitivos requieren este diseño de una matriz.

+0

No estoy de acuerdo con su razonamiento sobre si Sort fue un método de instancia. Todavía podría funcionar del modo que lo hace el método estático, sin la necesidad de escribir un tipo de matriz personalizado. –

+0

¿qué tipo para cada objeto secundario usaría ese método de instancia? –

+0

@Jeff Yates, pero si desea cambiar la implementación de ordenación, NO es necesario cambiar la clase Array, pero puede agregar el método estático en cualquier otro lugar. Pero desde la capacidad de LINQ en los lenguajes .NET, existen métodos de extensión, que parecen métodos de instancia, pero que son métodos estáticos. Es un compromiso bonito, creo. – TcKs

2

Estos son utilidad métodos que no necesitan pertenecer a estas clases. Esto refuerza la Single Responsibility Principle

(editar) me estaba confundiendo con Java

(About static members):

miembros de la clase estáticos pueden ser usados ​​para datos por separado y el comportamiento que es independiente de cualquier objeto identidad: los datos y las funciones no cambian independientemente de lo que ocurra con el objeto . Las clases estáticas se pueden usar cuando no hay datos o comportamiento en la clase que depende de la identidad del objeto .

El thread-safe point of view es también una buena razón.

+0

Gracias - aún me parece que una matriz debería poder ordenarla - si quisiera codificar en C++ lo haría :) – paul

+0

@bruno, pero "isLetter" depende de la identidad del objeto, ¿no? Quiero decir, 'A'.isLetter() es seguramente diferente de' 4'.isLetter(). –

+0

@Pedro, aquí, "los datos y las funciones no cambian independientemente de lo que le ocurra al objeto". Para que "c.isLetter()" exista, debería guardar un valor bool adicional en la estructura char. La implementación sería diferente ... –

Cuestiones relacionadas