Автоматические свойства В 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;