Автоматические свойства В C# 3-Необходимо объявить тело для get, если я объявляю его для set?

Я использую VS 2008, и на моих страницах свойств для проекта я вижу, что я нацелен на .Net 3.5.

вот ошибка, которую я получаю при попытке компиляции:

AMSDataModels.Транспорт.Вин.get ' должен объявить тело, потому что оно не помечено как абстрактное, внешнее или частичное

и вот код:

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, как он установлен.

у кого-нибудь есть предложение как это исправить или лучший способ подойти к проблеме под рукой?

мне очень нравится стенографическая нотация , но проверка законности ввода тоже важна!

4 ответов


Если вы собираетесь добавить логику в набор, вам также нужно добавить ее в 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. Ох, и ваш код не делает ничего, кроме проверки. Для этого Вам также потребуется предоставить дополнительную реализацию, предполагая, что вы хотите установить значение, если оно пройдет проверку.

Если вам нужно что-то большее, чем просто базовая реализация get/set, вам придется реализовать все свойство, а не только разницу.


вам придется использовать хорошее поле поддержки. Короткая нотация не может быть смешана. Единственное дополнительное удовольствие-изменить модификатор доступа на get и set, например get; private set;