Как создать изменяемые строки .NET? - PullRequest
0 голосов
/ 20 октября 2018

.NET-строки всегда неизменны, но как создать эквивалентный System.String класс, в котором значения строк могут быть изменены?

Например: когда изменяется a, я хочу bтакже будет изменено.

var a = "Hello";
var b = a;
a = "World";
var shouldBeTrue = String.ReferenceEquals(a, b) 
                   && String.Equals(b, "World");

Ответы [ 2 ]

0 голосов
/ 21 октября 2018

Как заметил @Christopher, скорее всего, что вам действительно нужно, это не изменяемость строк, а скорее механизм ссылок, с помощью которого синхронизируются несколько таких ссылок.Самым простым таким механизмом будет класс-оболочка, как в следующем примере:

    class Wrapper
    {
        public string Value { get; set; }
    }

    static void Main(string[] args)
    {
        Wrapper a = new Wrapper();
        a.Value = "Hello";
        Wrapper b = a;
        a.Value = "World";
        System.Diagnostics.Debug.Assert(ReferenceEquals(a, b));
        System.Diagnostics.Debug.Assert(a.Value == b.Value);
    }
0 голосов
/ 20 октября 2018

Струны являются неизменными, что было очень важным дизайнерским решением.Это помогает использовать их в многозадачных контекстах и ​​позволяет использовать множество других Оптимизаций, таких как String Interning.

Обычно интимабильность не является проблемой.Если вы не выполняете множество строковых операций, то, что накапливает маленькие мертвые строки, может обрабатывать GC, когда бы оно ни подходило к выполнению.

Для остальных случаев есть класс StringBuilder ,Чья цель - обойти неизменность и все такое, как интернирование.На более экстремальном уровне вы можете создать свой собственный список или массив Char.Только не забудьте предоставить пользовательский ToString ().Но как минимум для 95% всех случаев достаточно классов String и StringBuilder.

Редактировать:

Прочитав комментарий к вашему сообщению Originbal, я также заметил, что мутабилтий, похоже, нечто вы на самом деле ищете.Скорее тогда вы, кажется, ищете нормальную референсную механику.Хотя эта тема в некоторой степени связана с неизменяемостью, на самом деле это отдельное свойство.ссылка должна работать.Как было бы просто сделать класс с одним строковым полем и передать экземпляры этого класса.

...