Pergunta

Você deve usar ponteiros em seu código C #? Quais são os benefícios? É recomendável pelo homem (Microsoft)?

Foi útil?

Solução

De "The Man"-se:

O uso de ponteiros raramente é necessária em C #, mas existem algumas situações que necessitam deles. Como exemplos, usando um contexto inseguro para permitir ponteiros é justificada pelos seguintes casos:

  • Lidar com as estruturas existentes no disco
  • cenários COM Avançado ou invocação de plataforma que envolvem estruturas com ponteiros neles
  • código de desempenho crítico

O uso do contexto inseguro em outras situações é desencorajado.

Especificamente, um contexto inseguro não deve ser usado para tentar escrever o código C em C #.

Atenção:

O código escrito usando um contexto inseguro não pode ser verificada para ser seguro, por isso vai ser executada somente quando o código é totalmente confiável. Em outras palavras, o código inseguro não pode ser executado em um ambiente não confiável. Por exemplo, você não pode executar um código inseguro directamente a partir da Internet.

Referência

Outras dicas

Se você tiver que.

dizer que você precisa cor falsa uma grande imagem em tons de cinza, dizer 2000x2000 pixels. Primeiro escrever a versão 'segura' usando GetPixel() e SetPixel(). Se isso funcionar, ótimo, seguir em frente. se isso se revelar demasiado lento, pode ser necessário para obter os pedaços reais que compõem a imagem (esquecer Cor matrizes por causa do exemplo). Não há nada de 'ruim' sobre o uso de código inseguro, mas aumenta a complexidade do projeto e só deve, portanto, ser utilizado quando necessário.

Não me lembro de ter que fazê-lo - mas eu não tenho feito muito interoperabilidade. Essa é a aplicação mais comum, acredito: pôr em código nativo. Existem muito poucas vezes em que usando ponteiros permite otimizar algum código, mas é muito raro na minha experiência.

Se serve de guia, considero-me de ser muito experiente em C #, mas se eu tivesse que fazer qualquer código inseguro eu teria que consultar a especificação / livros / MSDN para me guiar. Claro que haverá muitas pessoas que estão felizes com código inseguro, mas menos familiarizados com (digamos) consulta expressões ...

Eu diria que as principais questões são: -

  • código inseguro não é verificável. Isto significa que o código pode única ser executado por um usuário a partir de um contexto totalmente confiável, assim, se você precisar de um usuário para executar o código a partir de qualquer lugar a menos de totalmente confiável (por exemplo, um compartilhamento de rede não configurado para ser assim), você está ferrado.
  • A falta de verificabilidade (hm não tenho certeza se isso é realmente uma palavra) também significa que você poderia potencialmente atrapalhar a memória em seu programa. Você é potencialmente trazendo classes inteiras de erros de volta para sua aplicação - o buffer derrapagens, balançando ponteiros, yada yada eca eca. para não mencionar sendo potencialmente capaz de estruturas de dados corrompidos na memória sem perceber quando o ponteiro passa estranho.
  • Se você quer que seu código inseguro para o acesso gerenciado objetos que você precisa 'pin' eles. Isto significa que o GC não tem permissão para mover o objeto em torno na memória e, assim, o gerenciado heap pode ficar fragmentada. Isto tem implicações de desempenho; portanto, é sempre importante para determinar se qualquer ganho perf potencial não é superado por este problema.
  • O código torna-se mais difícil de entender para os programadores não utilizados para a abordagem não gerenciado. Eles podem, então, ser mais responsável para atirar o seu pé fora com alguns dos 'liberdade' código inseguro dá-los.
  • Você se torna capaz de escrever código un-type-safe; este realmente bastante elimina um monte da vantagem de uma boa linguagem gerenciada caloroso. Agora você pode encontrar problemas de segurança de tipo horríveis. Por Take That para trás passo?
  • Não faz o seu código de mais feio .

Eu tenho certeza que há mais que poderia ser adicionado à lista; em geral, como os outros ter dito - evitar a menos que você tem to.e.g. chamando um método não gerenciado via p / invoke que requer alguma funking especial ponteiro. Mesmo assim, o marshaller impedirá principalmente a necessidade de que, na maior parte.

'O homem' também dizem evitar a menos que necessário, basicamente.

Oh, bom artigo sobre a pinagem aqui no MSDN pelo caminho .

código inseguro é um totalmente suportado função do .NET CLR. Os benefícios são o desempenho e compatibilidade com código binário. O tempo de execução é um sandbox que o impede de quebrar e queimar, mas que vem com um custo. Em situações em que você está fazendo operações extremamente intensivo contra grandes bolhas na memória, para a manipulação exemplo de imagem, é mais rápido para o passo fora da segurança normal, o tempo de execução fornece.

Dito isto, acho que mais pessoas aqui diria "não faça isso". A grande maioria dos desenvolvedores .NET não será executado em um caso em suas atividades normais que só pode ser resolvido por meio de código inseguro.

Eu usei código inseguro para usar a representação para permitir o acesso de serviços de compartilhamentos de rede. Não é um problema se você sabe o que está fazendo.

Você deve usá-los se você precisar deles; principalmente este será ao lidar com alguns cenários de interoperabilidade complicado (por exemplo, quando eu escrevi um wrapper gerenciado para DPAPI em .NET 1.0 eram necessários), mas muito ocasionalmente, pode ser para melhorar o desempenho (depois de perfil!) usando stackalloc ou similar.

É recomendado pela Microsoft na medida em que eles são os designers do C #, e eles tomaram a decisão de adicionar a capacidade de código unsafe escrever nele. Você pode ver a partir da escolha de palavras-chave e a exigência para delinear os métodos / classes em que você escrevê-lo utilizando palavras-chave, que não é projetado para ser a escolha de implementação de-facto.

Reinterpretive como moldes não fornecidos pela BitConverter.
Especificamente converter um unint em um int para funções hash, onde tudo o que importa é os bits.

Usando algumas útil, bem fundamentado sobre c ou funções idiomáticas C ++ em estruturas onde você precisa tratá-los como um byte * de um comprimento conhecido, novamente mais útil para hashing.

serialização Extremamente rápido binário de (muito específica) em estruturas de memória (por fazê-lo para uma matriz deles), embora para ser honesto isso é melhor feito por apenas caindo para C ++ / CLI.

Deve ser dito que, em muitos casos, a tarefa que exige ponteiros muitas vezes podem ser resolvidos melhor por fazê-lo em C ++ / CLI e, em seguida, importar este em você c projeto # como uma dll. Isso não muda se o código é 'seguro' ou não, mas ele faz um monte de funções úteis para operar em estruturas baseadas ponteiro mais acessíveis. Ele também permite que você estrague tudo com tipos genéricos ou enums se você realmente quer.

A probabilidade da maioria dos desenvolvedores necessidade de fazer isso é realmente remoto. Útil quando você precisar dele embora ...

Claro que não é "recomendado", é por isso que é rotulado de "inseguro". Mas não deixe que basílica de Sacré você. Embora, ele deve fazer você olhar duas vezes em seu código. Talvez haja uma maneira conseguiu fazê-lo?

usando o código inseguro é como esquecer os benenfits do .Net Framework, eu usei-los uma vez a estruturas antiquados criados como pilhas e outras coisas, mas isso foi só para a escola, não reembolsaram Hoje em dia eu tinha a necessidade de usá-los.

Fazê-lo se ele faz o seu código mais curto e mais claro.

"Siga suas inclinações tendo em conta o policial na esquina." WSM

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