Интерфейс реализации включает в себя запуск нового 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;
   }
}

Узнайте больше, здесь