Qualche uso reale dei puntatori in C #? [chiuso]

18

Che cos'è una situazione durante la codifica in C # in cui l'utilizzo dei puntatori è un'opzione valida o necessaria? Sto parlando dei puntatori non sicuri .

    
posta Gulshan 08.12.2010 - 12:22
fonte

4 risposte

24

Dallo sviluppatore di C # stesso:

L'uso dei puntatori è raramente richiesto in C #, ma ci sono alcune situazioni che li richiedono. Come esempi, l'utilizzo di un contesto non sicuro per consentire i puntatori è garantito dai seguenti casi:

  • Dealing with existing structures on disk
  • Advanced COM or Platform Invoke scenarios that involve structures with pointers in them
  • Performance-critical code

L'uso di un contesto non sicuro in altre situazioni è scoraggiato.

In particolare, un contesto non sicuro non dovrebbe essere usato per tentare di scrivere codice C in C #.

Attenzione: "Il codice scritto utilizzando un contesto non sicuro non può essere verificato per essere sicuro, quindi verrà eseguito solo quando il codice è completamente affidabile.In altre parole, il codice non sicuro non può essere eseguito in un ambiente non affidabile. Ad esempio, non è possibile eseguire codice non sicuro direttamente da Internet. "

Potresti passare attraverso questo per riferimento

    
risposta data 08.12.2010 - 13:10
fonte
17

Sì, ci sono usi reali, quando le prestazioni sono critiche e le operazioni sono di basso livello

per esempio, ho solo dovuto usare i puntatori in C # una volta, per confrontare le immagini. L'utilizzo di GetPixel su una coppia di immagini 1024x1024x32 ha richiesto 2 minuti per eseguire il confronto (corrispondenza esatta). Il blocco della memoria dell'immagine e l'uso dei puntatori richiedevano meno di 1 secondo (ovviamente sulla stessa macchina).

    
risposta data 08.12.2010 - 15:40
fonte
6

Devi ricordare che i progettisti di Microsoft sono persone intelligenti e tutto ciò che aggiungono a C # ha almeno un caso d'uso. Il progetto FParsec utilizza un codice non sicuro per far emergere l'ultima goccia di prestazioni di cui C # è capace. Prendi nota dell'uso di fixed e stackalloc .

private char* ReadCharsFromStream(char* buffer, int maxCount, out string overhangChars) {
    Debug.Assert(maxCount >= 0);
    fixed (byte* byteBuffer = ByteBuffer) {
        overhangChars = null;
        try {
            while (maxCount >= MaxCharCountForOneByte) {// if maxCount < MaxCharCountForOneByte, Convert could throw
                int nBytesInByteBuffer = FillByteBuffer();
                bool flush = nBytesInByteBuffer == 0;
                int bytesUsed, charsUsed; bool completed = false;
                Decoder.Convert(byteBuffer + ByteBufferIndex, nBytesInByteBuffer,
                                buffer, maxCount, flush,
                                out bytesUsed, out charsUsed, out completed);
                ByteBufferIndex += bytesUsed; // GetChars consumed bytesUsed bytes from the byte buffer
                buffer += charsUsed;
                maxCount -= charsUsed;
                if (flush && completed) return buffer;
            }
            if (maxCount == 0) return buffer;

            char* cs = stackalloc char[MaxCharCountForOneByte];
            for (;;) {
                int nBytesInByteBuffer = FillByteBuffer();
                bool flush = nBytesInByteBuffer == 0;
                int bytesUsed, charsUsed; bool completed;
                Decoder.Convert(byteBuffer + ByteBufferIndex, nBytesInByteBuffer,
                                cs, MaxCharCountForOneByte, flush,
                                out bytesUsed, out charsUsed, out completed);
                ByteBufferIndex += bytesUsed;
                if (charsUsed > 0) {
                    int i = 0;
                    do {
                        *(buffer++) = cs[i++];
                        if (--maxCount == 0) {
                            if (i < charsUsed) overhangChars = new string(cs, i, charsUsed - i);
                            return buffer;
                        }
                    } while (i < charsUsed);
                }
                if (flush && completed) return buffer;
            }
        } catch (DecoderFallbackException e) {
            e.Data.Add("Stream.Position", ByteIndex + e.Index);
            throw;
        }
    }
}
    
risposta data 08.12.2010 - 13:24
fonte
4

Una volta dovevo usare i puntatori (nel contesto non sicuro) in un'applicazione Windows basata su C # che fungesse da interfaccia per un auricolare. Questa applicazione è un'interfaccia utente che consente agli agenti (presso un call center) di controllare le proprie impostazioni delle cuffie. Questa applicazione funge da alternativa al pannello di controllo fornito dal produttore dell'auricolare. Pertanto, la loro capacità di controllare le cuffie era limitata rispetto alle opzioni disponibili. Ho dovuto usare i puntatori perché dovevo usare l'API (una DLL di Visual C ++) fornita dal produttore della cuffia usando P / Invoke.

    
risposta data 08.12.2010 - 16:46
fonte

Leggi altre domande sui tag