C#3中的自动属性 ​​- 如果我为set声明一个,必须声明一个get的主体吗?

我正在使用VS 2008,在项目的属性页面中,我看到我的目标是.Net 3.5。

这是我在尝试编译时遇到的错误:

AMSDataModels.Vehicle.VIN.get’必须声明一个正文,因为它没有标记为abstract,extern或partial

这是代码:

using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace AMSDataModels { public class Vehicle { //NodeID for datastore persistance public Guid NodeID { get; set; } public string VIN { get; set { if (value.Length != 17) throw new ArgumentOutOfRangeException("VIN", "VIN must be 17 characters"); } } public string Make { get; set; } public string Model { get; set; } } } 

如果我从身体上剥离身体,那么它只是:

 public string VIN { get; set; } 

一切正常,但我失去了检查VIN的能力。

有没有人建议如何解决这个或更好的方法来解决手头的问题?

我非常喜欢速记符号 – 但validation输入的合法性也很重要!

如果您要在集合中添加逻辑,则需要将其添加到get中。 请注意你的套装实际上没有设置任何值?

添加支持字段,

 private string _vin; 

并在get中返回。

 public string VIN { get { return _vin; } set { if (value.Length != 17) throw new ArgumentOutOfRangeException("VIN", "VIN must be 17 characters"); else _vin = value; } } 

使用自动属性时,编译器会自动生成一个支持字段。 当您声明自己的时候,它无法知道要用于get方法的字段。 所以你必须声明两者都没有。

顺便提一下,您当前的set方法只检查值 – 它实际上从未将它分配给任何东西。

是的,您还必须声明get实现。 哦,你的设置代码除了validation之外什么都不做。 您还需要为此提供其他实现,假设您希望在通过validation时设置该值。

如果您需要的不仅仅是基本的get / set实现,那么您必须实现整个属性,而不仅仅是区别。

你将不得不使用良好的支持领域。 简写符号不能混合使用。 唯一的额外乐趣是在get和set上更改访问修饰符,例如get; 私人集;