【问题标题】:c# struct/class initilaze a Arraylist时间:2019-04-10 标签:c#struct/classinitilaze一个Arraylist
【发布时间】:2011-01-07 07:47:40
【问题描述】:

我有这个代码:

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

我得到错误:

不能有实例字段 结构体中的初始化器

我尝试了不同的方法来克服这个错误,但没有成功,

如何在结构/类中有一个数组列表?

【问题讨论】:

  • 你从编译器得到的错误信息对我来说似乎很清楚......我想你可以自己解决这个问题。
  • 为什么它是一个结构体?如果没有非常充分的理由,那就是错误
  • (对于信息,你不能在结构上使用字段初始化器的原因是默认构造函数并不真正存在,即使它存在,也不能保证运行.. .)

标签: c# struct initialization arraylist


【解决方案1】:

那里有多个问题:

  • 具有可变结构 - 只是邪恶
  • 具有公共字段
  • 使用ArrayList

这些都不能帮助你...

使用 class 初始化程序可以正常工作

有一个属性你可以做惰性初始化:

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;}
}

【讨论】:

  • 为什么可变结构是邪恶的?如果你正在做的事情是一个值对象,那么使用结构体不是很好吗?
  • @Tomas 不完全理解结构的复制语义的人引入的错误数量惊人,丢失更改等问题也很严重。结构 可以 成功地用作可变实体,但作为例外而不是规则 - 它强制使用非常不同的编程风格(大量 ref,或直接在数组中访问 - 而不是列表或类似的)。我自己也经常使用它们。但是我看到的绝大多数可变结构使用不当,而且几乎总是我被要求调查的错误的根本原因。
  • 我很少像你一样使用结构体,我同意它们会带来很多痛苦,因为很多开发人员不知道如何处理它们。但是说他们“只是邪恶”是相当困难的:)。
【解决方案2】:

呃,我会让比我脑洞大的人解释原因,但你不能那样做。 :) 但是你可以这样做......

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

...或者这个...

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

但正如其他几个人所指出的那样,这两者都不是一个好主意。

【讨论】:

  • “你不能在结构中包含 ArrayList。” -1 这完全不正确。
  • 是的,措辞很糟糕。我会改写。
  • @cdhowie,是的,我觉得我的手指比我的大脑快。 :-)
  • @Haim,欢迎您,但请确保您注意其他答案中的建议。
  • 即使它有效,公共变量也不是那么好。这与公共属性的区别很小,但使用公共属性,您可以获得更多的“控制权”
【解决方案3】:

你应该为它创建一个类,我不会在结构中保留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;}
}

【讨论】:

    猜你喜欢
    • 2016-04-19
    • 2022-01-16
    • 2018-07-04
    • 2019-06-02
    • 1970-01-01
    • 1970-01-01
    • 2013-05-26
    • 2015-02-10
    • 2013-06-03
    相关资源
    最近更新 更多