Интерфейс реализации включает в себя запуск нового NotImplementedException... почему?
Я использую сообщество VS2017, и вчера он получил обновление. Сегодня я хотел реализовать интерфейс, и теперь реализация выглядит следующим образом:
public string City
{
get => throw new NotImplementedException();
set => throw new NotImplementedException();
}
Вместо этого (что я ожидал):
public string City { get; set; }
Почему это изменение? Не уверен, что это специфично для С# 7 или VS или что-то еще. Я просто знаю, что автоматическая реализация интерфейсов изменилась за последнюю неделю или около того.
Мой интерфейс:
public interface IMyInterface
{
string City { get; set; }
}
Ответы
Ответ 1
Я лично надеюсь, что это ошибка. На этом этапе мы можем только догадываться, почему команда изменила поведение.
Однако, во всяком случае, есть хорошая причина для внедрения "неудачного" кода по умолчанию: вы, как разработчик, должны сознательно принимать решение о том, как реализовать этот фрагмент кода. Что делать, если реализация метода по умолчанию просто вернет default(T)
? Код будет работать, пока кто-то не заметит код "не реализован".
Я бы сказал, что для свойств, которые вы, как правило, можете сказать в наши дни, что автоматически реализованные свойства - это путь. В 99% случаев реализация по умолчанию является правильной, в отличие от приведенных выше рассуждений о методах.
Ответ 2
Похоже, они просто сократили реализацию свойств интерфейса по умолчанию. В версиях до 2017 г. свойства интерфейса были реализованы по умолчанию:
public string City
{
get
{
throw new NotImplementedException();
}
set
{
throw new NotImplementedException();
}
}
Что я всегда считал пустой тратой экранной недвижимости. Лично я не люблю этот метод, но имеет смысл заглушить реализации интерфейса с помощью NotImplementedExceptions, чтобы заставить вас на самом деле что-то с ними делать.
Ответ 3
Автоматически сгенерированный код является частью подхода, основанного на тестировании (TDD). Методология диктует - сначала пропустите unit test, а затем код, чтобы исправить проблему. Это происходит в циклах теста немного и немного кода. С этими циклами задача завершается.
Он также применяется к тем приложениям, которые следуют гибкой методологии с частыми добавлением и развертыванием функций. Немногие вещи могут находиться в разработке, а другие связанные с ними стабильные компоненты идут в производство. Вложенные методы или свойства отмечены не реализованным тегом.
[TestClass]
public class UnitComp1
{
[TestMethod]
public void SalaryCalculationTest()
{
Payroll pr = new Payroll();
Assert.IsTrue(da.IsValidGrossAmount(2000), "Invalid gross amount");
}
}
//Cycle 1 - Test fails
public class Payroll
{
public bool IsValidGrossAmount(int amount)
{
throw new NotImplementedException();
}
}
//Cycle 2 - Test passes (done)
public class Payroll
{
public bool IsValidGrossAmount(int amount)
{
return amount > 1000;
}
}
Узнайте больше, здесь