Указатели в C # и как часто это используется в приложении? - PullRequest
4 голосов
/ 16 июня 2009

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

Ответы [ 4 ]

3 голосов
/ 16 июня 2009

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

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

2 голосов
/ 16 июня 2009

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

1 голос
/ 16 июня 2009

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

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

0 голосов
/ 16 июня 2009

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...