Использование структуры указателя как в C # - PullRequest
0 голосов
/ 27 апреля 2011

Мы переносим наш код с 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 = &objst1.strVal;

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

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

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

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

Ответы [ 2 ]

3 голосов
/ 27 апреля 2011

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

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

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

public class ReferenceString
{
    public String Value { get; set; }
}
0 голосов
/ 27 апреля 2011

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

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"
...