#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 #, у меня есть несколько предложений, таких как:
- Объявлять события
- Сделайте код небезопасным и используйте указатели (но я думаю, что это приведет к некоторым другим проблемам)
Пожалуйста, дайте мне знать, если здесь можно сделать что-то лучшее и близкое к 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"