Яка ситуація під час кодування в C #, де використання покажчиків є хорошим або необхідним варіантом? Я говорю про небезпечні покажчики.
Яка ситуація під час кодування в C #, де використання покажчиків є хорошим або необхідним варіантом? Я говорю про небезпечні покажчики.
Відповіді:
Від самого розробника C #:
Використання покажчиків рідко потрібно в C #, але є деякі ситуації, які вимагають їх. Як приклад, використання небезпечного контексту для дозволу покажчиків гарантується такими випадками:
- Робота з існуючими структурами на диску
- Розширені сценарії COM або Platform Invoke, що передбачають структури з покажчиками в них
- Критичний до продуктивності код
Використання небезпечного контексту в інших ситуаціях не рекомендується.
Зокрема, небезпечний контекст не повинен використовуватися для спроби запису коду С у C #.
Застереження: "Код, написаний з використанням небезпечного контексту, не може бути перевірений як безпечний, тому він буде виконуватися лише тоді, коли коду буде повністю довірено. Іншими словами, небезпечний код не може бути виконаний у ненадійному середовищі. Наприклад, ви не можете запустити небезпечний код безпосередньо з Інтернету. "
Ви можете переглядати це для довідки
так, є реальні можливості, коли продуктивність є критичною, а операції - низькими
наприклад, мені потрібно було лише один раз використовувати вказівники на C # для порівняння зображень. Використання GetPixel на парі 1024x1024x32 зображень знадобилося 2 хвилини для порівняння (Точне відповідність). Закріплення пам'яті зображення та використання покажчиків зайняло менше 1 секунди (звичайно, на тій же машині).
Ви повинні пам’ятати, що дизайнери Microsoft - це розумні люди, і все, що вони додають до C #, має принаймні 1 кейс використання. Проект FParsec використовує небезпечний код для виявлення кожної останньої краплі продуктивності, на яку здатний C #. Зверніть увагу на використання fixed
та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;
}
}
}
Мені колись доводилося використовувати вказівники (в небезпечному контексті) в додатку Windows на основі C #, який буде виконувати функції інтерфейсу для гарнітури. Ця програма - це інтерфейс користувача, який дозволить агентам (у кол-центрі) контролювати свої настройки навушників. Ця програма виконує функції альтернативи панелі керування, яку надає виробник гарнітури. Таким чином, їхня можливість керувати гарнітурами була обмежена порівняно з наявними опціями. Мені довелося використовувати вказівники, тому що мені довелося використовувати API (Visual C ++ dll), наданий виробником гарнітури за допомогою P / Invoke.