40 votes

Est le "ordre textuel" à travers des classes partielles formellement définis?

Plus précisément, en ce qui concerne le champ d'initialiseurs (dans ce cas, statique) - §17.11 dans ECMA 334:

Si une classe contient des champs statiques avec des initialiseurs, ceux des initialiseurs sont exécutés dans l'ordre textuel immédiatement avant l'exécution du constructeur statique.

Maintenant, si nous avons des partial classes dans des fichiers séparés, est que l'ordre déterminé n'importe où? Mon petit doigt me dit "pas formellement défini, mais probablement liés à la commande inclus dans le csproj, ou l'ordre indiqué à la scc". Est-ce correct?

(et oui, je me rends compte qu'il serait préférable d'éviter l'ambiguïté complètement - sans doute par le déplacement de toutes l'initialisation d'un constructeur statique).


Par exemple, si j'ai a.cs:

using System;
partial class Program
{
    private static int Foo = Write("Foo");
    static int Write(string name)
    {
        Console.WriteLine(name);
        return 0;
    }
    static void Main()
    {
        Console.WriteLine("[press any key]");
        Console.ReadLine();
    }
}

et b.cs:

partial class Program
{
    private static int Bar = Write("Bar");
}

et:

<Compile Include="a.cs" />
<Compile Include="b.cs" />

puis c'est l' Foo alors Bar; toutefois, si ce n'est:

<Compile Include="b.cs" />
<Compile Include="a.cs" />

puis il est Bar alors Foo. Cela prend en charge l'observation, mais ne prend pas en état fortement. §8.7.13 (Partielle déclarations de type) ne fait aucun commentaire sur le bon de commande lors de la combinaison de partial les classes. Donc; est-il rien de plus fort, nous pouvons dire ici, que ce soit à partir du langage C# spec ou de l'outillage de la documentation?

En outre, il se comporte de la même façon avec csc a.cs b.cs vs csc b.cs a.cs.

20voto

Ani Points 59747

Voici un autre extrait du C# spec qui, prises avec votre extrait de code, apparaît à régler que c'est un comportement indéterminé:

10.2.6 Membres

[...] L'ordre des membres dans un type est rarement significative à Le code C#, mais peut être importante lors de l'interfaçage avec d'autres langages et des environnements. Dans ces cas, l'ordre des membres dans un type déclaré dans plusieurs parties n'est pas défini.

Pour être juste, il ne dit rarement significatives, pas anodin :).

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X