如何修改结构中的值?

时间:2012-12-21 14:47:57

标签: collections struct variable-assignment

我的结构类:

public struct PinAndRadius
{
    public string pinID { get; set; }
    public string radiusID { get; set; }

    public string getPinID()
    {
        return pinID;
    }

    public string getRadiusID()
    {
        return radiusID;
    }
}

有问题的方法:

void mapArea_VE_PinDragged(double latitude, double longitude, object id)
{
    foreach (var pin in pinRadiusCollection)
    {
        string ID = id.ToString();
        //string newID = ID.Substring(0, 18);
        if (!pin.Key.pinID.Equals(ID))
        {
            continue;
        }
        else if (pin.Key.pinID.Equals(ID))
        {
            var newLoc = createNewSearchLocation(latitude, longitude);
            mapArea.VE_DeleteRadius(pin.Key.radiusID);
            drawPoly(newLoc, pin.Value.xar_Radius);
            pin.Key.radiusID = pollyID;
            break;
        }
    }
}

问题在于,当我尝试将pin.key.radiusID设置为pollyID时,我收到错误消息

  

无法修改'System.Collections.Generic.KeyValuePair.Key'的返回值,因为它不是变量......

有什么想法吗?

4 个答案:

答案 0 :(得分:0)

.net中的结构是值类型。这意味着您无法使用PinAndRadius引用pin.Key。您将获得pin.KeyPinAndRadius的副本。然后你无法访问这个副本,编译器会告诉你这个。在C ++术语中,它不是l值。

如果您创建struct,请始终尝试将其设为不可变。可变结构是邪恶的。

解决此问题的最简单方法是将PinAndRadius设为class

答案 1 :(得分:0)

根据它的外观,pinRadiusCollection是由PinAndRadius键入的通用字典;你得到的错误是让你知道你不能修改那个对象,因为它被用作你词典中的密钥。

如果你的别针应该是可变的,你应该重新审视你如何存储它们。

答案 2 :(得分:0)

.net中的集合未设置为允许方便地修改其中包含的struct-type项目。尽管如此,可变结构仍然提供比任何其他类型的数据类型更清晰的语义。要编辑集合中保存的结构,只需将其复制到变量,编辑该变量并将其存储回来:

var temp = myList[someIndex];
temp.SomeVield = whatEver;
myList[someIndex] = temp;

请注意,让可变结构将其内容作为字段而不是属性公开通常会更好。有些人可能会说可变结构是邪恶的,因为它们的语义不同于类,但这就像说螺丝刀是邪恶的,因为它们制造糟糕的锤子。 Exposed-field结构不像类类型那样工作,但是所有字段都暴露的结构都具有彼此相同的语义。这些语义与类不同,但对于它们有用的情况,它们并不相同。

顺便提一下,很多坏的代表“可变结构”得到的结果是,如果应用于只读结构,变异的结构成员而不是暴露的字段通常会产生伪代码。如果你避免使用修饰this字段的结构成员[静态结构方法修改接收为ref参数的结构字段是完全安全的],那么这些危险就不适用了。

答案 3 :(得分:0)

我只是将结构定义更改为类。