我创建了一个结构,它有另一个结构作为属性。我希望能够做到这样的事情:
MyColor.RGBColor.R = 255;
MyColor和RGBColor是我创建的结构。这不起作用,我为RGBColor设置了一个全新的值,但这不是直截了当的,必须有一个更简单的方法。目前,我必须这样做:
MyColor.RGBColor = new RGBColor(255, MyColor.RGColor.G ...)
我很确定如果我停止在公共属性中封装私有属性,并且首先让它们公开,我不会有这个问题......但我总是读到这对于那么,我怎么能这样做呢?感谢
编辑:
这就是我目前实现属性的方式:
private rgbcolor _RGBColor;
public rgbcolor RGBColor {
get {
return _RGBColor;
}
set {
_RGBColor = value;
}
}
答案 0 :(得分:2)
这是预期的行为。通过访问属性RGBColor
,您可以调用其getter方法,该方法按值返回struct的实例。即使您将({实际上甚至不编译)值分配到R
,结构本身也不会存储回到RGBColor
属性 - 即使它有一个二传手。这就是值类型的行为方式。
如果可以,请避免使用结构。在具有自动引用和具有getter / setter方法的属性的类的世界中,它们往往非常违反直觉。尝试将小类(就数据大小而言)表示为结构premature optimization。
注意:您称之为“私有财产”的是不属性。这是一个成员领域。
答案 1 :(得分:0)
您应该查看类名与变量名的约定。你的实现似乎有些倒退。
以下是我认为你要做的事情:
private rgbcolor _RGBColor = new rgbcolor();
public rgbcolor RGBColor {
get {
return _RGBColor;
}
}
一旦到位,你应该可以做一些事情(假设在rgbcolor上有一个属性R)
MyColor.RGBColor.R = 255;
这将起作用,因为当访问RGBColor属性时,MyColor.RGBColor的实例将存在。
答案 2 :(得分:0)
当你使用值类型(结构)时,你应该记住,在方法中将它们作为参数传递或从方法返回(在某些其他情况下)总是会导致制作该对象的副本。属性只是编译后的方法。所以你的代码实际上是平等的:
var copy = MyColor.RGBColor; // you get a copy now
copy.R = 255; // and now you change a copy, not the original object's value
C#compiller明白这是一个错误,并没有编译您想要的变体。因此,强烈建议创建 imutable 结构。在你的情况下,最好使用类。