Как тип String передается в метод или присваивается переменной в C #? - PullRequest
5 голосов
/ 11 февраля 2012

Объект String ведет себя как тип Value при использовании операторов == и! =, Что означает, что проверяется фактический объект, а не ссылка.

А как насчет передачи параметров, присвоений и копирования?

Передача параметров строки: Когда ссылочный тип передается методу, его ссылка копируется, но базовый объект остается прежним.

Будет ли это также верно для типа String в C #? Я имею в виду, что в приведенном ниже коде будет 2 указателя (messageVar и messageParam), указывающих на один и тот же объект:

public static void main()
{
   string messageVar = "C#";
   Test(messageVar);

   // what about in assignement?
   string messageVar2 = messageVar;
}
public void Test(string messageParam)
{
// logic
}

Как насчет того, когда он назначен переменной? Я предполагаю, что ссылка будет скопирована только, а фактический объект останется таким же кэшированным в String Intern Pool. Не уверен.

Будет ли messageVar2 также ссылаться на тот же объект?

Спасибо

Ответы [ 4 ]

3 голосов
/ 11 февраля 2012

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

Вы можете легко проверить это, используя Object.ReferenceEquals()чтобы проверить, указывают ли две ссылки на один и тот же экземпляр объекта - я немного изменил ваш пример, чтобы показать это:

static string messageVar = "C#";
public static void Main(string[] args)
{
    bool isSame = Test(messageVar); //true

    // what about in assignement?
    string messageVar2 = messageVar;
    isSame = Object.ReferenceEquals(messageVar2, messageVar);//also true
}

public static bool Test(string messageParam)
{
    // logic
    bool isSame = Object.ReferenceEquals(messageParam, messageVar);
    return isSame;
}
2 голосов
/ 11 февраля 2012

«Объект String ведет себя как тип Value при использовании операторов == и! =, Что означает, что проверяется фактический объект, а не ссылка.»

Класс String не получает специальной обработкина уровне языка) в этом отношении.Причина того, что операторы == и != сравнивают значения (а не ссылки) строк, заключается в том, что они были перегружены ;см. Оператор Строкового неравенства и Оператор Строкового неравенства .

Любой пользовательский класс может также перегружать эти два оператора для сравнения равенства значений объектов (хотя обычно это рекомендуется только для неизменяемых типов, таких как String).

0 голосов
/ 11 февраля 2012
0 голосов
/ 11 февраля 2012

Это именно то, что происходит.

Небольшой поворот с string s заключается в том, что они неизменны: любая операция, которая выглядит, как будто она изменяет строку, фактически создает новую.Таким образом, строки не могут быть изменены после их создания.Кроме того, строки работают как любой другой ссылочный тип: они доступны по ссылке, и передача их в функцию передает копию ссылки (если вы не используете ref или out), поэтому изменяете ссылку вФункция не влияет на значение в вызывающем коде.

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