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

8

我正在使用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的能力。
有人有修复此问题或更好地解决此问题的建议吗?
我真的很喜欢速记符号——但验证输入的合法性也很重要!

感谢所有指出我实际上没有设置值的人 - 说实话,我还没有弄清楚编译器创建的局部变量叫什么。有特殊的关键字吗? - Matt
1
没有特殊的关键字 - 没有办法访问编译器生成的自动生成的内容。这是有道理的,因为生成的代码的强大之处在于它的简单性和编译器准确地知道如何访问它。如果您能够定义或访问自动字段,则编译器无法对其使用进行太多假设。 - Paul Alexander
当您尝试使用INotifyPropertyChanged时,您将遇到相同的问题,自动属性的美丽很快就会消失 :( - Nate
4个回答

19

如果您要在set中添加逻辑,那么也需要在get中添加逻辑。请注意,在您的set中,实际上没有将值设置为任何内容?

添加后备字段。

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

谢谢,我想我的首要任务是确保我没有做不必要的工作来创建私有字段,也没有以某种方式错误地使用自动属性。 - Matt
实际上,您不需要创建一个字段,只需返回VIN即可 :) - Hannoun Yassir
5
“return VIN”是翻译成中文的内容。除此之外,根据您提供的上下文,“That would be a recursive function unless I am missing something obvious...”意思是“那将是一个递归函数,除非我漏掉了什么显而易见的东西...”。 - Ed S.
1
如果你错过了它,那我也是。 - Brandon

6
自动属性使用时,编译器会自动生成一个后备字段。当您自己声明时,编译器无法确定要在get方法中使用哪个字段。因此,您必须同时声明两个或不声明。

顺便说一下,您当前的set方法仅检查值-它从未实际分配给任何内容。


3

是的,您也必须声明获取实现。哦,而且您的设置代码除了验证之外没有其他操作。如果您想在通过验证后设置值,则还需要提供其他实现。

如果您需要的不只是基本的get/set实现,那么您需要实现整个属性,而不仅仅是差异部分。


2

您需要使用旧的后备字段。简写符号不能混合使用。唯一的额外乐趣是更改get和set上的访问修饰符,例如:get; private set;


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接