Вопрос

Это объявление функции на С#:

void foo(string mystring)

то же самое, что и это в C:

void foo(char *)

то естьВ C# получает ли вызываемая функция указатель за кулисами?

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

Решение

В данном конкретном случае это больше похоже на:

void foo(const char *);

Строки .Net неизменяемы и передаются по ссылке.Однако в целом C# получает указатель или ссылку на объект «за кулисами».

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

В C# существуют указатели, хотя они больше похожи на интеллектуальные указатели C++, поэтому необработанные указатели инкапсулированы.char* на самом деле не то же самое, что System.String, поскольку указатель на char обычно означает начало массива символов, а строка C# представляет собой объект с полем длины. и массив символов.Указатель указывает на внешнюю структуру, которая указывает на что-то вроде wchar_t массив, поэтому существует некоторая косвенность со строкой C# и более широкими символами для поддержки Unicode.

Нет.В C# (и всех других языках .NET) String является первоклассным типом данных.Это не просто набор символов.Вы можете конвертировать их туда и обратно, но они ведут себя по-разному.Существует ряд методов манипулирования строками (например, «Substring()» и «StartsWith»), доступных классу String, которые не применяются к массивам в целом, а массив символов является просто экземпляром.

По сути, да.В C# строка (на самом деле System.String) является ссылочным типом, поэтому при вызове foo() она получает указатель на строку в куче.

Для типов значений (int, double и т. д.) функция получает копию значения.Для других объектов это ссылка, указывающая на исходный объект.

Строки особенные, потому что они неизменяемы.Технически это означает, что ссылка будет передана, но на практике это будет вести себя во многом как тип значения.

Вы можете заставить типы значений передавать ссылку, используя ref ключевое слово:

public void Foo(ref int value) { value = 12 }
public void Bar()
{
    int val = 3;
    Foo(ref val);
    // val == 12
}

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

Если вы имеете в виду — будет ли метод иметь доступ к содержимому символьного пространства, то ответ — да.

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

Однако они НЕ одинаковы.

в c указатель указывает на строку, которая также может использоваться где-то еще, поэтому ее изменение повлияет на эти другие места.

Насколько мне известно, все классы в C# (насчет остальных не уверен) являются ссылочными типами.

Все, что не является «типом значения», который по существу охватывает перечисления, логические значения и встроенные числовые типы, будет передаваться «по ссылке», что, возможно, совпадает с механизмом C/C++ передачи по ссылке или указателю.Синтаксически и семантически он по существу идентичен передаче данных по ссылке в C/C++.

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

Также обратите внимание, что вы не можете передать аргумент как «const» в C#, независимо от того, является ли он типом значения или ссылочным типом.

Хотя они действительно эквивалентны в семантическом смысле (т.е.код что-то делает со строкой), C#, как и Java, полностью исключает указатели из повседневного использования, относя их к таким областям, как переходы к собственным функциям ОС - даже в этом случае существуют классы инфраструктуры, которые красиво их оборачивают, например как Сафефилехэндл.

Короче говоря, не переусердствуйте, думая об указателях в C#.

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