我相信这已被回答之前抱歉,但我不能凝结我的问题,以一个googlable短语。物业实施 - Noob缺乏知识
我有一个Pt3类,这是一个3D笛卡尔点(x,y,z属性加上一些其他的好东西)。我使用Pt3类型作为RegionProvider类中的get/set属性值 - Location和Normal。
的位置属性是好的,我不在乎财产是如何设置的:
//Location set method 1 - sweet...
RegionProvider Foo = new RegionProvider();
Foo.Location.x = 10;
Foo.Location.y = 20;
Foo.Location.z = 30;
//Location set method 2 - also sweet...
RegionProvider Foo2 = new RegionProvider();
Foo2.Location = new Pt3(10, 20, 30);
的普通属性,虽然需要不同的行为。如果需要,我希望RegionProvider类将输入标准化为Normal属性。如果调用者将“正常”值设置为40,50,60,则RegionProvider类将归一化为0.4558,0.5698,0.66838(给出向量长度== 1)。如果主叫方将执行以下操作,一切都很酷...
//Normal set method A - sweet...
Foo.Normal = new Pt3(40, 50, 60);
...但如果如果他们做到这一点悲伤将接踵而至:
//Normal set method B - grief...
Foo2.Normal.x = 40;
Foo2.Normal.y = 50;
Foo2.Normal.z = 60;
...因为RegionProvider类将作为正常化每个元素都被设置。我想要做的是防止调用者看到Normal属性的x,y,z,所以他们被迫使用上面的方法'A'。
一个解决方案可能是不规范化属性设置,但规范化属性获取但这看起来像fakery。
对于它的价值,这是我的普通财产申报:提前任何帮助
/// <summary>
/// Property for the objects normal
/// </summary>
public Pt3 Normal
{
set
{
_normal = Bit555ModelCore.NormalizeVector(value);
this.NotifyPropertyChanged("Normal");
}
get
{
return _normal;
}
}
干杯....
标准.NET陷阱,从来没有以同样的方式,总是同样的问题。 Normal属性是一个值类型,当您访问它时会得到一个副本。您将更新副本,而不是原件。样板的智慧是“不要改变结构”。 – 2012-07-22 22:47:59
@HansPassant我不认为这个问题是关于struct的。这是关于不允许独立设置属性的属性。 – svick 2012-07-22 23:42:12