Pergunta

É esta declaração de função em C#:

void foo(string mystring)

o mesmo que esta em C:

void foo(char *)

i.e.Em C#, a função chamada recebe um ponteiro de bastidores?

Foi útil?

Solução

Neste caso específico, é mais como:

void foo(const char *);

.Net strings são imutáveis e passados por referência.No entanto, em geral, C# recebe um ponteiro ou referência a um objeto por trás dos bastidores.

Outras dicas

Existem ponteiros dos bastidores do C#, que eles são mais como C++ponteiros inteligentes, de modo que as matérias ponteiros são encapsulados.Um char* não é realmente o mesmo Sistema.Cadeia desde um ponteiro para um char normalmente, significa o início de uma matriz de caracteres, e uma cadeia de caracteres C# é um objecto com um campo de comprimento e uma matriz de caracteres.O ponteiro aponta para o exterior de estrutura que aponta para algo como um wchar_t matriz, portanto, há algum engano com uma cadeia de caracteres C# e maior caracteres para Unicode oferece suporte.

Não.Em C# (e todos os outros .A NET languages) o texto é uma primeira classe de tipo de dados.Não é simplesmente uma matriz de caracteres.Você pode converter de e para trás entre eles, mas eles não se comportam da mesma.Há um número de métodos de manipulação de seqüência de caracteres (como "Substring()" e "Começa") que estão disponíveis para a classe String, a qual não se aplicam a matrizes em geral, uma matriz de caracteres é simplesmente uma instância de.

Basicamente, sim.Em C#, seqüência (na verdade do Sistema.Seqüência de caracteres) é um tipo de referência, portanto, quando o foo() é chamado, ele recebe um ponteiro para a string na pilha.

Para tipos de valores (int, double, etc.), a função recebe uma cópia do valor.Para outros objetos, é uma referência apontando para o objeto original.

Cadeias de caracteres são especiais porque elas são imutáveis.Tecnicamente, isso significa que ele vai passar a referência, mas na prática ele vai se comportar muito bem como um tipo de valor.

Você pode forçar tipos de valor para passar uma referência usando o ref palavras-chave:

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

não em c# seqüência de caracteres unicode.em c# não é chamado de um ponteiro, mas uma referência.

Se você quer dizer - este método vai ser autorizados a acessar o conteúdo do espaço de caractere, a resposta é sim.

Sim, porque uma seqüência de caracteres é de dinâmicas de tamanho, de modo que deve haver memória de heap do por trás das cenas

No entanto, eles NÃO são o mesmo.

em c que o ponteiro aponta para uma cadeia de caracteres que pode também ser usado em outros lugares, por isso, a mudança vai afectar os outros lugares.

Até onde eu sei, todas as classes em C# (não sei sobre os outros) são tipos de referência.

Tudo o que não é um "tipo de valor", o que basicamente cobre enums, booleanos, e built-in de tipos numéricos, vai ser transmitido "por referência", que é, sem dúvida, o mesmo que o C/C++ mecanismo de passagem por referência ou ponteiro.Sintaticamente e semanticamente é essencialmente idêntico ao C/C++ passagem por referência.

No entanto, observe que, no C# strings são imutáveis, por isso mesmo que ela é passado por referência você não pode editar cadeia de caracteres, sem criar um novo.

Observe também que você não pode passar um argumento como "constante" em C#, independentemente se ela é um tipo de valor ou um tipo de referência.

Enquanto aqueles que são de fato equivalentes em um sentido semântico (por exemplo,o código está fazendo algo com uma seqüência de caracteres), C#, como Java, mantém ponteiros completamente fora de seu uso cotidiano, relegando-as para áreas tais como transições para OS nativos funções - mesmo assim, existem classes do framework que enrole os muito bem, como SafeFileHandle.

Longa história curta, não sair de sua maneira de pensar de ponteiros em C#.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top