web-dev-qa-db-fra.com

Ignorer la signification des fonctionnalités dans C # 7.0?

En passant par de nouveaux C# 7.0 fonctionnalités, je suis resté avec rejeter fonctionnalité. Ça dit:

Les rejets sont des variables locales que vous pouvez attribuer mais que vous ne pouvez pas lire. c'est-à-dire qu'il s'agit de variables locales "en écriture seule".

et puis, un exemple suit:

if (bool.TryParse("TRUE", out bool _))

Quel est le véritable cas d'utilisation lorsque cela sera bénéfique? Je veux dire que si je l'aurais défini de manière normale, dites:

if (bool.TryParse("TRUE", out bool isOK))
18
rahulaga_dev

Les discards sont fondamentalement un moyen d'ignorer intentionnellement les variables locales qui ne sont pas pertinentes aux fins du code produit. C'est comme lorsque vous appelez une méthode qui renvoie une valeur mais, comme vous n'êtes intéressé que par les opérations sous-jacentes qu'elle effectue, vous n'affectez pas sa sortie à une variable locale définie dans la méthode de l'appelant, par exemple:

public static void Main(string[] args)
{
    // I want to modify the records but I'm not interested
    // in knowing how many of them have been modified.
    ModifyRecords();
}

public static Int32 ModifyRecords()
{
    Int32 affectedRecords = 0;

    for (Int32 i = 0; i < s_Records.Count; ++i)
    {
        Record r = s_Records[i];

        if (String.IsNullOrWhiteSpace(r.Name))
        {
            r.Name = "Default Name";
            ++affectedRecords;
        }
    }

    return affectedRecords;
}

En fait, je l'appellerais une fonctionnalité esthétique ... dans le sens où c'est une fonctionnalité au moment de la conception (les calculs concernant les variables rejetées sont effectués de toute façon) qui aide à garder le code clair, lisible et facile à entretenir.

Je trouve l'exemple montré dans le lien que vous avez fourni un peu trompeur. Si j'essaie d'analyser un String en tant que Boolean, il y a de fortes chances que je veuille utiliser la valeur analysée quelque part dans mon code. Sinon, j'essaierais juste de voir si le String correspond à la représentation textuelle d'un Boolean (un regular expression, par exemple ... même une simple instruction if pourrait faire le travail si le boîtier est correctement géré). Je suis loin de dire que cela ne se produit jamais ou que c'est une mauvaise pratique, je dis simplement que ce n'est pas le modèle de codage le plus courant que vous devrez peut-être produire.

L'exemple fourni dans cet article , au contraire, montre vraiment tout le potentiel de cette fonctionnalité:

public static void Main()
{
    var (_, _, _, pop1, _, pop2) = QueryCityDataForYears("New York City", 1960, 2010);
    Console.WriteLine($"Population change, 1960 to 2010: {pop2 - pop1:N0}");
}

private static (string, double, int, int, int, int) QueryCityDataForYears(string name, int year1, int year2)
{
    int population1 = 0, population2 = 0;
    double area = 0;

    if (name == "New York City")
    {
        area = 468.48;

        if (year1 == 1960) {
            population1 = 7781984;
        }

        if (year2 == 2010) {
            population2 = 8175133;
        }

        return (name, area, year1, population1, year2, population2);
    }

    return ("", 0, 0, 0, 0, 0);
}

D'après ce que je peux voir en lisant le code ci-dessus, il semble que les discards ont une sinergie plus élevée avec d'autres paradigmes introduits dans les versions les plus récentes de C# comme déconstruction de tuples .


Pour les programmeurs Matlab, discards sont loin d'être un nouveau concept car le langage de programmation les implémente depuis très, très, très longtemps (probablement depuis le début, mais je ne peux pas dire avec certitude ). La documentation officielle les décrit comme suit (lien ici ):

Demandez les trois sorties possibles à la fonction fileparts :

helpFile = which('help');
[helpPath,name,ext] = fileparts('C:\Path\data.txt');

L'espace de travail actuel contient désormais trois variables des parties de fichier: helpPath, name et ext. Dans ce cas, les variables sont petites. Cependant, certaines fonctions renvoient des résultats qui utilisent beaucoup plus de mémoire. Si vous n'avez pas besoin de ces variables, elles gaspillent de l'espace sur votre système.

Ignorez la première sortie en utilisant un tilde (~):

[~,name,ext] = fileparts(helpFile);

La seule différence est que, dans Matlab, les calculs internes pour les sorties rejetées sont normalement ignorés car les arguments de sortie sont flexibles et vous pouvez savoir combien et lequel d'entre eux a été demandé par l'appelant.

23
Tommaso Belluzzo

Plusieurs fois, j'ai fait du code dans ce sens:

TextBox.BackColor = int32.TryParse(TextBox.Text, out int32 _) ? Color.LightGreen : Color.Pink;

Notez que cela ferait partie d'une plus grande collection de données, pas une chose autonome. L'idée est de fournir un retour immédiat sur la validité de chaque champ des données qu'ils saisissent.

J'utilise le vert clair et le rose plutôt que le vert et le rouge auxquels on pourrait s'attendre - ces dernières couleurs sont suffisamment sombres pour que le texte devienne un peu difficile à lire et la signification des versions plus claires est toujours totalement évidente.

(Dans certains cas, j'ai également une couleur.Jaune pour signaler quelque chose qui n'est pas valide mais qui n'est pas totalement invalide. Supposons que l'analyseur accepte les fractions et que le champ contient actuellement "2 1". Cela pourrait faire partie de "2 1/2 "donc ce n'est pas des ordures, mais ce n'est pas non plus valide.)

3
Loren Pechtel

J'ai vu des rejets utilisés principalement contre des méthodes qui retournent Task<T> Mais vous ne voulez pas await la sortie.

Donc, dans l'exemple ci-dessous, nous ne voulons pas attendre la sortie de SomeOtherMethod() pour pouvoir faire quelque chose comme ceci:

//myClass.cs
public async Task<bool> Example() => await SomeOtherMethod()

// example.cs
Example();

Sauf que cela générera l'avertissement suivant:

CS4014 Comme cet appel n'est pas attendu, l'exécution de la méthode actuelle se poursuit avant la fin de l'appel. Pensez à appliquer l'opérateur "wait" au résultat de l'appel.

Pour atténuer cet avertissement et garantir essentiellement au compilateur que nous savons ce que nous faisons, vous pouvez utiliser un rejet:

//myClass.cs
public async Task<bool> Example() => await SomeOtherMethod()

// example.cs
_ = Example();

Plus d'avertissements.

1
Zze