«Стойкость» в C #. Как хранить объекты между процедурами? - PullRequest
1 голос
/ 14 сентября 2009

У меня есть графический интерфейс, который позволяет пользователю создавать и изменять точечный объект. Мне нужно сохранить список этих точек для вставки в конкретный чертеж.

Вот как я это придумал:

В коде формы я открыл приватное свойство List<Points> и манипулировал им непосредственно внутри кода формы. Это правильный способ обработки?

Что-то вроде:

public partial class TesteInterface_AdicionarVertice : Form {

   public List<VerticeDNPM> listaVertices;

   public TesteInterface_AdicionarVertice()
   {
      InitializeComponent();
      listaVertices = new List<VerticeDNPM>();
   }

}

Итак, что вы думаете об этом дизайне? Есть ли лучший способ сделать это? <Ч /> Спасибо за все мысли.

Я сделаю список только для чтения. спасибо за эту идею.

Реальная вещь здесь такова: у меня есть кнопка, которая создает точки, и другая, которая создает полигоны из точек.

Мне нужен способ получить список точек в то время, когда пользователь выбирает создание этого определенного многоугольника. Это в основном то, что я спрашиваю: P

Я хотел бы использовать свойство класса (в данном случае List) для хранения временных точек, пока пользователь не создаст многоугольник. Это правильный подход?

Ответы [ 7 ]

1 голос
/ 14 сентября 2009

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

public partial class TestInterface_ADicionaryVertice : Form 
{
    private List<VerticeDNPM> listVertices = new List<VerticeDNPM>();
    public List<VerticeDNPM> { get { return listVertices; } }

    public TestInterface_ADiciontaryVertice()
    {
        InitializeComponent();
        ...manipulate list of points here...   
    }
}

Таким образом, вы изменяете личный список точек в своем коде, в то же время позволяя потребителю (предположительно что-то, что получает форму в качестве параметра?) Получить доступ к списку точек и прочитать его.

Две дополнительные мысли: 1) Если единственный потребитель использует эту форму вместо того, чтобы работать с ней (где-то получая ее в качестве параметра), рассмотрите возможность сделать список защищенным. 2) Если вы не хотите, чтобы какой-либо потребитель изменял список (т. Е. Список точек не может измениться после того, как вы закончили с ними манипулировать), тогда рассмотрите возможность выставления перечислителя для списка вместо самого списка. Таким образом, кто-то может перечислить пункты, но не может их изменить.

Пример: public IEnumerator GetPoints {get {return listVertices.GetEnumerator (); }}

1 голос
/ 14 сентября 2009

Я бы не стал публиковать ваш список. Тогда вы никогда не знаете, кто его модифицирует. Сделайте ваш список приватным, а затем выставьте его только для чтения.

Подробнее об этом можно прочитать здесь . Вы также можете запустить свой код через FxCop . Я уверен, что это подхватит это.

0 голосов
/ 14 сентября 2009

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

0 голосов
/ 14 сентября 2009

Спасибо за все мысли.

Я сделаю список только для чтения. спасибо за эту идею.

Реальная вещь здесь такова: У меня есть кнопка, которая создает точки, и другая, которая создает полигоны из точек.

Мне нужен способ получить список точек в то время, когда пользователь выбирает создание этого определенного многоугольника. Это в основном то, что я спрашиваю: P

Я хотел использовать свойство класса (в данном случае List) для хранения временных точек, пока пользователь не создаст многоугольник. Это правильный подход?

0 голосов
/ 14 сентября 2009

Если вы включите соответствующие включения в пространство имен и определения классов, то то, что вы опубликовали, является действительным и явно не нарушает какие-либо передовые практики (если не считать соглашения об именах, в этом случае VerticeDNPM должен быть VerticeDnpm в соответствии с рекомендациями Microsoft по именованию) , Однако, чтобы критиковать ваш подход с точки зрения дизайна, вам действительно нужно предоставить больше информации.

0 голосов
/ 14 сентября 2009

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

public partial class TesteInterface_AdicionarVertice : Form {
    private readonly List<VerticeDNPM> listaVertices = new List<VerticeDNPM>();
    public List<VerticeDNPM> Vertices {get; set;}; 

    public TesteInterface_AdicionarVertice()
    {
        InitializeComponent();       
    }
}
0 голосов
/ 14 сентября 2009

Извините за это. Правильный код:

открытый частичный класс TesteInterface_AdicionarVertice: Form {

    public List<VerticeDNPM> listaVertices;

    public TesteInterface_AdicionarVertice()
    {
        InitializeComponent();
        listaVertices = new List<VerticeDNPM>();
    }

}

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...