Есть ли способ сделать "деструктивные" строковые методы а-ля Ruby? - PullRequest
0 голосов
/ 08 января 2009

В Ruby методы, изменяющие объект, имеют удар на конце: string.downcase!

В c # вам нужно сделать: foo = foo.ToLower()

Есть ли способ сделать метод расширения вроде:

foo.ConvertToLower()

что бы манипулировать foo?

(я думаю, что ответ - нет, поскольку строки неизменны, и вы не можете сделать ref this в методе расширения.)

Ответы [ 3 ]

3 голосов
/ 08 января 2009

Есть два способа поменять экземпляр строки:

  • Отражение
  • Небезопасный код

Я бы не рекомендовал использовать любой из них. Ваши коллеги-разработчики будут ненавидеть вас вечно - особенно если метод когда-либо используется для изменения строки, которая оказывается буквальной ...

0 голосов
/ 08 января 2009

Нет, вы не можете сделать это в методе расширения. Чтобы переназначить значение переменной, переданной в качестве параметра, вы должны передать его по ссылке, используя модификатор параметра ref, что недопустимо для методов расширения. Даже если это будет возможно, переменная для переназначения может отсутствовать, как в "foo".ConvertToLower().

0 голосов
/ 08 января 2009

Вы, конечно, можете написать метод расширения, чтобы переназначить строку, с которой вы работаете. Например:

public static void ConvertToLower(this string s)
{
   s = s.ToLower();
}

Это не имеет ничего общего с неизменяемостью строк.

...