Использует ли C # указатель ->? - PullRequest
9 голосов
/ 19 июня 2011

Я пытаюсь выучить C # и знаком с нотацией структуры C ++, указывающей -> Мне было любопытно, если это перешло в C #.

Пример:

someStruct->someAttribute += 1;

Ответы [ 4 ]

23 голосов
/ 19 июня 2011

В C # есть нотация указателя, но только в особых случаях с использованием ключевого слова unsafe.

Обычные объекты разыменовываются с помощью ., но если вы хотите написать быстрый код, вы можете закрепить данные (чтобы избежать перемещения мусора сборщиком мусора) и, таким образом, "безопасно" использовать арифметику указателей, а затемможет потребоваться ->.

См. Типы указателей (Руководство по программированию в C #) и немного меньше в в этом примере об использовании -> в C #.

Это выглядит примерно так (из последней ссылки):

struct MyStruct 
{ 
    public long X; 
    public double D; 
}

unsafe static void foo() 
{
   var myStruct = new MyStruct(); 
   var pMyStruct = & myStruct;

   // access:

   (*pMyStruct).X = 18; 
   (*pMyStruct).D = 163.26;

   // or

   pMyStruct->X = 18; 
   pMyStruct->D = 163.26;
}
0 голосов
/ 02 марта 2012

Интересно, что C # решил использовать . вместо -> для ссылки на член объекта, на который ссылается ссылка на класс, так как семантика ближе к таковой оператора C ->, чем его .оператор.Например, в C, если кто-то видит код a=b; a.X=5;, он распознает, что он записывает в поле X некоторой структуры a, которая отличается от b.В отличие от этого, если человек увидит код a=b; a->X=5;, он поймет, что он пишет в поле X структуры, на которую указывают и a и b.В C # поведение рассматриваемого кода будет зависеть от того, является ли тип b классом или структурой.

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

0 голосов
/ 19 июня 2011

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

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

0 голосов
/ 19 июня 2011

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

Редактировать: как указано в комментариях ниже, это не так просто. Существуют ссылочные типы и типы значений. Я имел в виду, что между ссылочными типами и типами указателей нет различия.

Edit2: Хотя, очевидно, есть, если вы используете небезопасные части C #! Я кое-что узнал сегодня!

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