c # struct / class initilaze a Arraylist - PullRequest
       18

c # struct / class initilaze a Arraylist

1 голос
/ 07 января 2011

У меня есть этот код:

 public struct SmartFilter
    {
        public int from, to;
        public ArrayList collect  = new ArrayList();                 
        public long bit;            
    }

я получаю ошибку:

не может иметь поле экземпляра инициализаторы в структурах

я пытаюсь по-другому преодолеть эту ошибку,

как получить список массивов в структуре / классе?

Ответы [ 3 ]

5 голосов
/ 07 января 2011

Есть несколько проблем:

  • с изменяемой структурой - просто зло
  • с открытыми полями
  • с использованием ArrayList

ничто из этого не поможет вам ...

с class, инициализатор будет работать нормально

со свойством, которое вы могли бы сделать ленивым init:

public ArrayList Collect {
    get { return collect ?? (collect = new ArrayList()); }
}

Я бы рефакторинг:

public class SmartFilter
{
    public int From  {get;set;}
    public int To  {get;set;}
    private List<SomeKnownType> collect  = new List<SomeKnownType>();
    public List<SomeKnownType> Collect { get { return collect; } }
    public long Bit {get;set;}
}
3 голосов
/ 07 января 2011

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

class NotAStruct
{
    public int from, to;
    public ArrayList collect = new ArrayList();
    public long bit;   
}

... или это ...

struct Blah
{
    ArrayList doh;
    public void SomeMethod()
    {
        doh = new ArrayList();
    }
}

Но ни одна из них не является хорошей идеей, как указали несколько других людей.

2 голосов
/ 07 января 2011

Вы должны сделать его классом, я бы не стал хранить ArrayList в структуре, поскольку структура должна использоваться для простых данных.Что касается вашей ошибки, я думаю, вы просто можете удалить new ArrayList();, и она должна работать.

Я написал это, и она прекрасно работает:

public struct MyStruct
{
    public int intVal;
    public ArrayList listVal;
    public bool boolVal;
}

Однако, я действительно васвместо этого следует использовать класс;то есть используйте это вместо:

public class MyClass    {
    public int IntVal {get; set;}
    public ArrayList ListVal {get; set;}
    public bool BoolVal {get; set;}
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...