Ref параметры не меняют значение? C # - PullRequest
3 голосов
/ 16 марта 2019

В настоящее время я пишу простую программу для работы в колледже и, используя функцию для обнаружения символов в строке и их удаления, предполагается, что функция выдает bool, а новая строка должна быть в качестве параметра-ссылки, однако в качестве ссылки параметр не работает и данные не переносятся?

    public static bool DetectAndRemoveCharacter(ref string Word, char Character)
    {
        bool returnVal = false;
        for (int x = 0; x < Word.Length; x++)
        {
            if (Word[x] == Character)
            {
                Word.Remove(x, 1);
                returnVal = true;
                break;
            }
        }
        return returnVal;
    }

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

Set = DetectAndRemoveCharacter(ref Letters, '?');

Ответы [ 2 ]

4 голосов
/ 16 марта 2019

Строки являются неизменяемыми объектами и не могут быть изменены. Метод Remove не изменяет исходный объект, вы должны переназначить результат переменной:

Word = Word.Remove(x, 1);
3 голосов
/ 16 марта 2019

Строки неизменны в .net.Это означает, что каждый раз, когда вы изменяете строку, возвращается новая строка.Исходная строка не изменяется.Ваш код не фиксирует это.

Попробуйте:

public static bool DetectAndRemoveCharacter(ref string Word, char Character)
{
    bool returnVal = false;
    for (int x = 0; x < Word.Length; x++)
    {
        if (Word[x] == Character)
        {
            // assign value here
            Word = Word.Remove(x, 1);
            returnVal = true;
            break;
        }
    }
    return returnVal;
}
...