2009-04-04 21 views
6

Me pregunto si string.Length en C# es una variable instantánea. Por variable instantánea quiero decir, cuando creo la cadena:¿Es string.Length in C# (.NET) variable instantánea?

string A = ""; 

A = "Som Boh"; 

¿Se está calculando la longitud ahora?

O

¿Se calcula sólo después de que intenta conseguir a.length?

Respuesta

14

En primer lugar, tenga en cuenta que las cadenas en .NET son muy diferentes a las cadenas almacenadas en lenguajes no administrados (como C++) ... En el CLR, la longitud de la cadena (en caracteres y en bytes) se almacena en memoria para que el CLR sepa cuán grande es el bloque de memoria (matriz de caracteres) que contiene la cadena. Esto se hace al crear la cadena y no se cambia dado que el tipo System.String es inmutable.

En C++ esto es bastante diferente, ya que la longitud de una cadena se descubre al leer hasta el primer carácter nulo. Debido a la forma en que funciona el uso de la memoria en el CLR, esencialmente puede considerar que obtener la propiedad Length de una cadena es como recuperar una variable int. El costo de rendimiento aquí será absolutamente mínimo, si eso es lo que está considerando.

Si desea obtener más información sobre las cadenas en .NET, intente con Jon Skeet's article sobre el tema; parece que tiene todos los detalles que tal vez quiera saber sobre las cadenas en .NET.

1

Parece que es una propiedad de cadena, que probablemente esté configurada en el constructor. Como no es una función, dudo que se compute cuando la llamas. Simplemente están obteniendo el valor de la propiedad Length.

9

La longitud de la cuerda no se calcula, se conoce en tiempo de construcción. Dado que String es inmutable, no habrá necesidad de calcularlo más tarde.

Una cadena .NET se almacena como un campo que contiene el recuento de caracteres y una serie correspondiente de caracteres Unicode.

3

. Las cadenas .NET se almacenan con la longitud precalculada y almacenada al comienzo de la estructura interna, por lo que la propiedad .Length simplemente recupera ese valor, por lo que es una función O (1).

+0

No es realmente "precalculada" tanto como la propiedad Longitud para la clase de cadena inmutable simplemente devuelve la propiedad Longitud para la estructura de datos subyacente. –

+1

En realidad, hay un número almacenado allí (en la estructura de datos subyacente) que representa la longitud de la cadena, y el número existe como resultado de algún cálculo. Ya sea que use o no la propiedad Length, ese número siempre se calcula y siempre se almacena en la estructura de datos subyacente. Eso es lo que quiero decir con "precalculado". – tylerl