Указатели в C# и как часто они используются в приложении?

StackOverflow https://stackoverflow.com/questions/1001522

  •  05-07-2019
  •  | 
  •  

Вопрос

Для меня указатель был одной из самых сложных концепций в языках программирования C++.Когда я изучал C++, я потратил огромное количество времени на его изучение.Однако сейчас я в основном работаю над проектами, полностью написанными на таких языках, как C#, VB.NET и т. д.На самом деле, я НЕ прикасался к C++ уже почти 4 года.Несмотря на то, что в C# есть указатель, я не встречал ситуации, когда мне пришлось бы использовать указатель в C#.Итак, мой вопрос: какую производительность мы можем получить в C#, используя указатель?Какова ситуация, когда необходимо использовать указатель?

Это было полезно?

Решение

Лично у меня никогда не было необходимости использовать указатели в .NET, но если вы имеете дело с кодом, критичным к абсолютной производительности, вы бы использовали указатели. Если вы посмотрите на класс System.String, вы увидите, что многие методы, которые обрабатывают манипуляции со строками, используют указатели. Кроме того, при работе с изображениями очень часто полезно использовать указатели. Теперь можно определенно спорить, должны ли такие приложения быть написаны в первую очередь в .NET (я думаю, что они должны), но, по крайней мере, если вам нужно выжать лишнюю скорость, вы можете.

Другие советы

Вы уже используете много указателей в C #, за исключением того, что они не похожи на указатели. Каждый раз, когда вы что-то делаете с экземпляром класса, это указатель. Вы получаете почти все потенциальные выгоды уже без хлопот.

Можно использовать указатели более явно в C #, что большинство людей подразумевают под C # указателями, но я думаю, что это будет очень редко. Они могут быть полезны для ссылок на библиотеки C и тому подобное, но кроме этого я не вижу особой пользы для них.

Я использую указатели в C # только в редких случаях, которые в основном связаны с отправкой / получением данных, когда необходимо преобразовать байтовый массив в структуру и наоборот. Хотя даже тогда вам не нужно иметь дело с указателями напрямую.

В некоторых случаях вы можете использовать указатели для повышения производительности, потому что с помощью Marshaller иногда вам приходится копировать память для доступа к данным, а с помощью указателей вы можете обращаться к ней напрямую (подумайте, Bitmap.Lock () ).

Лично мне никогда не приходилось использовать указатель в C#.Если мне нужна такая функциональность, я пишу этот код на C++/CLI и вызываю его из C#.Если мне нужно передать указатели из C# в C++/CLI или наоборот, я передаю их как ИнтПтр и привести его к нужному мне типу в C++/CLI.

На мой взгляд, если вы используете указатели в C#, то в 99% случаев вы используете язык неправильно.

Редактировать:Хорошая особенность C++/CLI заключается в том, что вы можете помечать отдельные классы для компиляции только в машинном коде.Я выполняю много работы по обработке изображений, которая должна выполняться очень быстро;он использует много кода на основе указателей.Обычно у меня есть перенаправление управляемых объектов C++/CLI на собственный объект C++, где происходит моя обработка.Я включаю оптимизацию для этого собственного кода и альта, получаю хороший прирост производительности.

Конечно, это имеет значение только в том случае, если прирост производительности, который вы получаете за счет выполнения собственного оптимизированного кода, может компенсировать накладные расходы на переходы от управляемого к неуправляемому.В моем случае так всегда.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top