web-dev-qa-db-fra.com

L'interface d'implémentation inclut une nouvelle exception NotImplementedException ... pourquoi?

J'utilise VS2017 Community et il vient de recevoir une mise à jour hier. Aujourd'hui, je voulais implémenter une interface et maintenant, l'implémentation ressemble à ceci:

public string City 
{ 
    get => throw new NotImplementedException(); 
    set => throw new NotImplementedException(); 
}

Au lieu de cela (ce à quoi je m'attendais):

public string City { get; set; }

Pourquoi ce changement? Vous ne savez pas si cela est spécifique à C # 7 ou VS ou autre chose. Je sais juste que l'implémentation automatique des interfaces a changé au cours des dernières semaines.

Mon interface:

public interface IMyInterface
{
    string City { get; set; }
}
22
Christian

J'espère personnellement que c'est un bug. À ce stade, nous ne pouvons que deviner pourquoi l’équipe a changé le comportement.

Cependant, en règle générale, il existe une bonne raison d'implémenter le code "défaillant" par défaut: vous, en tant que développeur, devez délibérément décider de la manière dont vous souhaitez implémenter ce morceau de code. Et si l'implémentation par défaut d'une méthode renverrait simplement default(T)? Le code «fonctionnera» jusqu'à ce que quelqu'un remarque le code «non implémenté».

Je dirais cependant que pour les propriétés, on peut généralement dire de nos jours que les propriétés implémentées automatiquement sont la voie à suivre. Dans 99% des cas, l'implémentation par défaut est la bonne, contrairement au raisonnement ci-dessus pour les méthodes.

13
Patrick Hofman

Donc, je sais que c'est une vieille question, mais il semblerait que Visual Studio 2017 vous permette maintenant de choisir entre les deux styles (throw vs plain old get;set;). (J'utilise 15.7.5 of 2017 Community).

Pour ce faire, sélectionnez Outils => Options => Editeur de texte => C # => Avancé et faites défiler vers le bas, où vous devriez avoir une section Implement Interface or Abstract Class.

À l'intérieur de cela, vous pouvez définir le bouton radio When generating properties sur la valeur par défaut "Préférer les propriétés de projection" ou sur l'ancien style en sélectionnant "Propriétés de préférence auto".

Voici où chercher dans le paramètre Options:  enter image description here

10
Kolichikov

On dirait qu'ils viennent de raccourcir l'implémentation par défaut des propriétés de l'interface. Dans les versions antérieures à 2017, les propriétés d'interface ont été implémentées comme suit:

    public string City
    {
        get
        {
            throw new NotImplementedException();
        }

        set
        {
            throw new NotImplementedException();
        }
    }

Ce que j'ai toujours pensé être un gaspillage de l'immobilier à l'écran. Personnellement, je n’apprécie guère l’une ou l’autre des méthodes, mais il est logique de supprimer les implémentations d’interface avec NotImplementedExceptions pour vous forcer à en faire quelque chose.

6
Steve In CO

Le code généré automatiquement fait partie de l’approche TDD (Test Driven Development). La méthodologie l'exige - échouez d'abord au test unitaire, puis codez pour résoudre le problème. Il continue en cycles de test un peu et code un peu. Avec ces cycles, une tâche est terminée.

Cela s'applique également aux applications qui suivent une méthodologie agile avec des ajouts et des déploiements fréquents de fonctionnalités. Peu de choses pourraient être en cours de développement et d’autres composants stables associés vont à la production. Les méthodes ou propriétés en cours sont marquées avec la balise non implémentée.

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

Découvrez plus, ici

1
gray-wolf