繁体   English   中英

在结构中设置属性的属性?

[英]Setting a property of a property in a struct?

我创建了一个结构,该结构具有另一个结构作为属性。 我希望能够做这样的事情:

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

这是预期的行为。 通过访问属性RGBColor ,可以调用其getter方法,该方法按value返回结构的实例。 即使您随后将一个值(实际上甚至不会编译)赋值给R ,该结构本身也不会存储RGBColor属性中-即使它具有setter。 这就是值类型的行为。

如果可以,请避免使用结构。 在具有自动引用的类和具有getter / setter方法的属性的世界中,它们往往非常违反直觉。 尝试将小类(就数据大小而言)表示为结构是过早的优化

注意:您所谓的“私有财产” 不是财产。 这是一个成员字段。


您应该查看类名与变量名的约定。 您的实现似乎有些倒退。


这是我认为您要尝试执行的操作:

private rgbcolor _RGBColor = new rgbcolor();
public rgbcolor RGBColor {
  get {
    return _RGBColor;
  }
}

一旦到位,您应该可以执行类似的操作(假设rgbcolor上有属性R)

MyColor.RGBColor.R = 255;

这将起作用,因为访问RGBColor属性时将存在MyColor.RGBColor的实例。

当使用值类型(结构)时,请记住,将它们作为参数传递给方法或从方法返回(在某些情况下也是如此)总是会导致该对象的复制。 属性只是编译后的方法。 因此,您的代码实际上是相等的:

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#编译器知道这是一个错误,请不要编译所需的变体。 因此,强烈建议您创建不可更改的结构。 在您的情况下,最好使用类。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM