2012-12-21 67 views
0

我的结构类:如何修改结构中的值?

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'的返回值,因为它不是一个变量...

有什么建议吗?

回答

0

我只是简单地将struct定义更改为一个类。

+0

你是否理解结构和类之间的差异?更改为类将使代码编译,但语义与使用结构时的语义不同。有些情况需要类似结构的语义(在这种情况下,应该使用我提出的方法),而其他情况则需要类语义。如果一个'PinAndRadius'类型的变量被存储在一个集合中,然后这个变量的'RadiusId'随后被改变,你是否想要集合中的''RadiusId'也改变?如果你这样做,一个可变类将是适当的。如果没有... – supercat

+0

...那么可变类是错误的使用(因为通过改变一个实例访问的属性将改变所有对该实例的引用所看到的属性)。由于例外情况相对较少,每个可变对象实例在任何给定时间都必须只有一个所有者,并且任何持有对可变对象的引用的代码都需要知道它是否拥有所讨论的对象。没有正式的机制来跟踪谁拥有什么,但是在不知道谁拥有它们的情况下传递混杂的对象引用是错误的秘诀。 – supercat

+0

在这种情况下,集合应该会经常更改,因为我将删除它,因此为什么我使用了一个可变类,即时通讯相当新的C#所以我非常感谢您提供的解释非常有帮助 –

0

.net中的结构是值类型的。这意味着你不能使用pin.Key得到PinAndRadius的参考。您将获得PinAndRadius类型的pin.Key的副本。然后你没有访问这个副本,编译器告诉你这个。在C++中它不是l值。

如果您创建struct总是尝试使其不可变。可变的结构是邪恶的。

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

0

从外观上看,您的pinRadiusCollection是通用字典PinAndRadius;你得到的错误是让你知道你不能修改那个对象,因为它被用作字典中的键。

如果你的针脚应该是可变的,你应该重新访问你的存储方式。

0

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

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

注意,它通常是更好的具有可变结构暴露其内容不是属性的字段。有些人可能会说可变结构是邪恶的,因为它们的语义不同于类,但这就像说螺丝刀是邪恶的,因为它们造成糟糕的锤子。暴露域结构不像类类型那样工作,但所有暴露域的结构都具有相同的语义。这些语义与类不同,但对于它们有用的情况,它们没有平等的含义。

顺便说一下,很多坏的代表的“可变结构”得到的是一个事实,即其他变异结构成员比暴露领域如果应用到只读结构往往会产生虚假的代码的结果。如果您避免使用修改this字段的结构成员[静态结构方法修改接收的结构字段作为ref参数是完全安全的],则这些危险不适用。