Использование структуры, подобной указателю, в C#

#c# #.net #pointers #unsafe

#c# #.net #указатели #небезопасно

Вопрос:

Мы переносим наш код с C на C # и из-за ограниченных знаний C # мы попали в странную ситуацию. Наша проблема заключается:

В c у нас есть 2-3 типа классов / структур, которые имеют указатели на свойство (std:: string), назначение указателя — убедиться, что все экземпляры для похожих объектов будут указывать на одно и то же свойство. например

 struct st1{
   string strVal;
};
struct st2{
   string* strVal;
};
//At time of creation
st1* objst1 = new st1();
st2* objst2 = new st2();
objst2.strVal = amp;objst1.strVal;

//After this at all point both object will point to same value.
  

Я хочу такую архитектуру C #, у меня есть несколько предложений, таких как:

  1. Объявлять события
  2. Сделайте код небезопасным и используйте указатели (но я думаю, что это приведет к некоторым другим проблемам)

Пожалуйста, дайте мне знать, если здесь можно сделать что-то лучшее и близкое к C ..

Комментарии:

1. В отличие от std::string, System. Строка неизменяема, и обычно нет смысла заботиться о ссылках на строки, значение имеет значение.

2. Вы можете перенести большую часть своего кода C в C # напрямую, используя ключевое слово unmanaged. При этом для обработки событий ознакомьтесь с делегатами, обработчиками событий и функциями<T> и Action<T> . Многое из этого написано здесь .

Ответ №1:

В C # все классы являются ссылками / указателями. Таким образом, пока ваше свойство имеет тип class, вы можете иметь один и тот же экземпляр в разных структурах.

Но проблема может возникнуть при использовании string. Хотя это свойство класса и ссылки, оно принудительно воспроизводится. Поэтому, когда вы ее изменяете, вы не изменяете сам экземпляр, но создаете новую копию с этими изменениями.

Одно из решений, которое приходит на ум, — создать пользовательский класс string, который будет просто содержать string и использовать его в качестве вашего типа:

 public class ReferenceString
{
    public String Value { get; set; }
}
  

Комментарии:

1. Другой вариант — использовать StringBuilder, который является изменяемым и лучше соответствует std::string.

2. @Felixt : Я не знаю. Не является ли StringBuilder несколько тяжеловесным? И кажется неправильным использовать такой класс, как store. Но я могу ошибаться.

3. StringBuilder Реализован в виде связанного списка char[] массивов, где каждый массив содержит не более 8 тыс. символов. Это делает вставки очень быстрыми и не допускает их попадания в кучу больших объектов, но делает их менее легкими, чем строка (которая представляет собой просто массив символов).

Ответ №2:

Вы могли бы использовать статическое свойство с наследованием:

 class thing
{
  static string stringThing;
  public string StringThing
  {
    get { return stringThing; }
    set { stringThing = value; }
  }
}

class thing2 : thing
{
}
  

Затем позже:

 thing theThing = new thing();
theThing.StringThing = "hello";

thing2 theThing2 = new thing2();
// theThing2.StringThing is "hello"