4

我收到以下从德语翻译的错误:

错误 BC30068:表达式是一个值,不能作为赋值的目标。

我正在尝试执行以下操作:

sheet.Cells(row, col).Value = newVal ' this is VB

我已将 Cells 声明为:

public Cell Cells(int x, int y) // this is C#
{
    return new Cell(this, x, y);
}

public struct Cell
{
    Worksheet ws;
    int x;
    int y;

    public Cell(Worksheet ws, int x, int y)
    {
        this.ws = ws;
        this.x = x;
        this.y = y;
    }

    public object Value
    {
        get { return ws.GetCellValue(x, y); }
        set { ws.SetCellValue(x, y, value); }
    }
}

我怎么解决这个问题?我不希望 Cell 成为一个类,而是成为一个结构,因为否则任何访问都会在堆上创建一个新对象。当然我可以缓存所有创建的单元对象,但这可能会引入错误并浪费大量内存和新的间接层。

有更好的方法吗?

4

5 回答 5

1

如果它是一个结构,您将不得不取出值,修改它,然后将其传回:

Cell cell = sheet.Cells(row, col);
cell.Value = newVal;
sheet.Cells(row, col) = cell; // assuming this has a setter

但坦率地说,我认为你关于每个单元格的对象(类)太贵的断言没有抓住重点......

顺便说一句,我还建议结构应该尽可能不可变(由于特定原因,XNA可能除外)。

于 2010-02-25T12:39:05.703 回答
1

把它变成一个类有什么问题?

另外,为什么不直接使用索引器:

public object this[int column, int row] {
    get { return this.GetCellValue(column, row); }
    set { this.SetCellValue(column, row, value); }
}

这样,您可以像这样使用它:

sheet[column, row] = newValue;
于 2010-02-25T12:08:10.923 回答
1

您看到的行为是 .net 不区分结构属性和改变字段结构本身的方法和不改变字段的方法的结果。理想情况下,.net 语言将禁止在只读结构上使用任何变异方法和属性,同时允许非变异方法和属性。不幸的是,由于 .net 没有提供结构方法或属性是否会改变基础结构的指示,所以今天的 C# 和 vb.net 只是假设属性设置器会影响基础结构,而其他方法不会。较旧的 C# 编译器允许调用所有结构成员代码,包括属性 getter,通常会产生不希望的结果。

微软决定应该使用属性设置器来改变结构,而不是指定将要可变的结构要么直接公开字段,要么使用静态方法修改,这太糟糕了。如果他们在诸如此类的事情上采用了这样的方法Point,那么导致可变结构被标记为“邪恶”的抱怨就会被避免,并且像你这样的代码会工作得很好。哦,好吧,无用的“封装”的奇迹就这么多。

于 2011-01-22T04:47:03.157 回答
0

我现在通过从包含索引器的 Cells 属性返回 CellCollection 来解决它。这样我就不会再收到错误了,我只需为所有单元格创建一个对象。

于 2010-03-01T12:07:43.707 回答
0

我的回答是 - 不要创建Valuea 属性。让它有两种方法 -GetValue()SetValue(). 这样就没有任务了。

于 2010-03-01T12:21:16.123 回答