Pregunta

Es esta declaración de la función en C#:

void foo(string mystring)

el mismo que esta en C:

void foo(char *)

es decir,En C#, hace el llamado de la función de recibir un puntero detrás de las escenas?

¿Fue útil?

Solución

En este caso específico, es más como:

void foo(const char *);

.Net cadenas son inmutables y se pasa por referencia.Sin embargo, en general C# recibe un puntero o una referencia a un objeto detrás de las escenas.

Otros consejos

No hay punteros detrás de las escenas en C#, a pesar de que son más parecidos a los de C++'s de punteros inteligentes, por lo que el crudo punteros están encapsulados.Char* no es realmente el mismo Sistema.Cadena desde un puntero a char generalmente significa el inicio de una matriz de caracteres, y un C# string es un objeto con un campo de longitud y una matriz de caracteres.El puntero que señala a la estructura externa que señala en algo parecido a un wchar_t de la matriz, por lo que hay algunos direccionamiento indirecto con C# y de cadena más amplia de caracteres de Unicode apoyo.

No.En C# (y todos los demás .NET languages) la Cadena es una primera clase de tipo de datos.No es simplemente una matriz de caracteres.Usted puede convertir de ida y vuelta entre ellos, pero ellos no se comportan de la misma.Hay un número de cadena de manipulación de los métodos (como el "Substring()" y "StartsWith") que están disponibles para la clase String, que no se aplican a matrices, en general, una matriz de caracteres, es simplemente una instancia de.

Básicamente, sí.En C#, de la cadena (en realidad el Sistema.Cadena) es un tipo de referencia, por lo que cuando foo() es llamada, recibe un puntero a la cadena en el montón.

Los tipos de valor (int, double, etc.), la función recibe una copia del valor.Para otros objetos, es una referencia que apunta al objeto original.

Las cadenas son especiales porque son inmutables.Técnicamente esto significa pasar la referencia, pero en la práctica se comportan prácticamente como un tipo de valor.

Usted puede forzar a los tipos de valor para pasar una referencia mediante el uso de la ref palabra clave:

public void Foo(ref int value) { value = 12 }
public void Bar()
{
    int val = 3;
    Foo(ref val);
    // val == 12
}

no en c# cadena unicode.en c# no es llamado un puntero, pero una referencia.

Si lo que quieres decir - le que el método sea permitido el acceso a los contenidos del espacio de carácter, la respuesta es sí.

Sí, porque una cadena es la de la dinámica de tamaño, por lo que debe ser la memoria heap detrás de las escenas

Sin embargo, ellos NO son el mismo.

en c, el puntero apunta a una cadena que también puede ser utilizado en otros lugares, por lo que el cambio afectará a aquellos otros lugares.

Hasta donde yo sé, todas las clases en C# (no estoy seguro acerca de los otros) son los tipos de referencia.

Algo que no es un "tipo de valor", que básicamente cubre las enumeraciones, booleanos, y construido en los tipos numéricos, pasa "por referencia", que es sin duda el mismo que el de C/C++ mecanismo de pasar por referencia o puntero.Sintácticamente y semánticamente es esencialmente idéntica a la de C/C++ pasar por referencia.

Nota, sin embargo, que en C# las cadenas son inmutables, por lo que aunque se pasa por referencia no se puede editar la cadena sin crear uno nuevo.

También tenga en cuenta que usted no puede pasar un argumento como "const" en C#, independientemente de si es un valor de tipo o de un tipo de referencia.

Mientras que los que son de hecho equivalentes en un sentido semántico (es decir,el código está haciendo algo con una cuerda), C#, Java, mantiene punteros completamente fuera de su uso cotidiano, relegando a áreas tales como las transiciones a la nativa de mac OS funciones - incluso entonces, hay marco clases que envuelven los del bien, tales como SafeFileHandle.

Larga historia corta, no salen de su manera de pensar de los punteros en C#.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top