210 votes

Pourquoi isn ' t String.Empty une constante ?

Dans .net Pourquoi est String.Empty lire seulement au lieu d’une constante ? Je me demande si quelqu'un sait ce que le raisonnement était derrière cette décision.

165voto

Jeff Yates Points 36725

La raison qu' static readonly est utilisé à la place de const est due à l'utilisation avec du code non managé, comme indiqué par Microsoft ici, à la Source Partagée Common Language Infrastructure de la Version 2.0. Le fichier de regarder est - sscli20\clr\src\bcl\system\string.cs.

Le Vide constante est le vide chaîne de valeur. Nous avons besoin d'appeler le Chaîne constructeur de sorte que le compilateur ne marque pas cela comme un littéral.

Ce marquage comme un littéral signifie qu'il n'apparaît pas comme un champ accès à partir de la maternelle.

J'ai trouvé cette information à partir de cette pratique de l'article sur CodeProject.

28voto

bruno conde Points 28120

Je pense qu'il y a beaucoup de confusion et de mauvaise réponses ici.

Tout d'abord, const champs static membres (pas les membres de l'instance).

Vérifiez la section 10.4 Constantes de la spécification du langage C#.

Même si les constantes sont considérés comme des les membres statiques, une constante de la déclaration de ne nécessite ni ne permet une statique modificateur.

Si public const des membres sont statiques, on ne peut pas considérer qu'une volonté constante de créer un nouvel Objet.

Compte tenu de cela, les lignes de code suivantes faire exactement la même chose à l'égard de la création d'un nouvel Objet.

public static readonly string Empty = "";
public const string Empty = "";

Voici une note de Microsoft qui explique la différence entre les 2:

Le mot clé readonly est différente de le mot-clé const. Un champ peut const seulement être initialisé à la déclaration du champ. Un champ peut être en lecture seule initialisé soit à la déclaration ou dans un constructeur. Par conséquent, readonly les champs peuvent avoir différentes valeurs selon le constructeur utilisé. Aussi, alors qu'un const champ est un constante à la compilation, le readonly le terrain peut être utilisé pour l'exécution des constantes, ...

Donc, je trouve que la seule réponse plausible est ici Jeff Yates.

7voto

Aristos Points 40367
String.Empty read only instead of a constant?

Si vous faites une chaîne constante, alors le compilateur est remplacer par la chaîne de partout, vous l'appelez et vous remplissez votre code avec la même chaîne de partout et quand le code s'exécute est également nécessaire de lire encore et encore, que la chaîne à partir des différentes données de la mémoire.

Si vous laissez votre chaîne lue sur un seul lieu, car c'est l' String.Empty, le programme garde la même chaîne sur un seul lieu et de le lire, ou reportez-vous à garder les données dans la mémoire de plus de moins.

Aussi, si vous compiler une dll à l'aide de la Chaîne.Vide comme const, et pour une raison quelconque la Chaîne.Vide modifier, puis de la dll compilée ne fonctionnent plus du tout le même, parce que l' cost l'intérieur de code à fait garder une copie de la chaîne à chaque appel.

Voir ce code par exemple:

public class OneName
{
    const string cConst = "constant string";
    static string cStatic = "static string";
    readonly string cReadOnly = "read only string";

    protected void Fun()
    {
        string cAddThemAll ;

        cAddThemAll = cConst;
        cAddThemAll = cStatic ;
        cAddThemAll = cReadOnly;    
    }
}

seront venu par le compilateur comme:

public class OneName
{
    // note that the const exist also here !
    private const string cConst = "constand string";
    private readonly string cReadOnly;
    private static string cStatic;

    static OneName()
    {
        cStatic = "static string";
    }

    public OneName()
    {
        this.cReadOnly = "read only string";
    }

    protected void Fun()
    {
        string cAddThemAll ;

        // look here, will replace the const string everywhere is finds it.
        cAddThemAll = "constant string";
        cAddThemAll = cStatic;
        // but the read only will only get it from "one place".
        cAddThemAll = this.cReadOnly;

    }
}

et l'assemblée appel

        cAddThemAll = cConst;
0000003e  mov         eax,dword ptr ds:[09379C0Ch] 
00000044  mov         dword ptr [ebp-44h],eax 
        cAddThemAll = cStatic ;
00000047  mov         eax,dword ptr ds:[094E8C44h] 
0000004c  mov         dword ptr [ebp-44h],eax 
        cAddThemAll = cReadOnly;
0000004f  mov         eax,dword ptr [ebp-3Ch] 
00000052  mov         eax,dword ptr [eax+0000017Ch] 
00000058  mov         dword ptr [ebp-44h],eax 

-1voto

Garry Shutler Points 20898

Cette réponse existe pour des raisons historiques.

À l'origine:

Parce qu' String est une classe et, par conséquent, ne peut pas être une constante.

Discussion Prolongée:

Beaucoup de dialogue, qui s'est forgée dans l'approbation de cette réponse, et plutôt que de le supprimer, ce contenu est reproduit directement:

Dans .NET, (contrairement à Java) de la chaîne et de la Chaîne sont exactement les mêmes. Et oui, vous pouvez avoir un littéral de chaîne constantes .NET – DrJokepu Fév 3 '09 à 16:57

Vous dites qu'une Classe ne peut pas avoir des constantes? – StingyJack Fév 3 '09 à 16:58

Oui, les objets ont à utiliser en lecture seule. Seulement les structures peuvent faire constantes. Je pense que lorsque vous utilisez string au lieu de String le compilateur change la const dans un readonly pour vous. Tous à faire avec le maintien de programmeurs C heureux. – Garry Shutler Fév 3 '09 à 16:59

tvanfosson viens de l'expliquer un peu plus verbeux. "X ne peut pas être une constante, parce que le contenant Y est une classe" était juste un peu trop libre de tout contexte ;) – Leonidas Fév 3 '09 à 17:01

chaîne de caractères.Vide est propriété statique qui retourne une instance de la classe String, à savoir la chaîne vide, pas de la classe string. – tvanfosson Fév 3 '09 à 17:01

Vide est en lecture seule instance (ce n'est pas une propriété) de la classe String. – senfo Fév 3 '09 à 17:02

La tête de faire du mal. Je pense toujours que je suis de droite, mais maintenant j'en suis moins certain. Recherche ce soir! – Garry Shutler Fév 3 '09 à 17:07

La chaîne vide est une instance de la classe string. Vide est un champ statique (pas une propriété, je corrige la position des mains) sur la classe String. En gros la différence entre un pointeur et la chose qu'il indique. Si ce n'était pas en lecture seule nous pourrions changer l'instance le champ Vide. – tvanfosson Fév 3 '09 à 17:07

Garry, vous n'avez pas besoin de faire de la recherche. Pensez à ce sujet. String est une classe. Vide est une instance d'une Chaîne. – senfo Fév 3 '09 à 17:12

Il y a quelque chose que je n'ai pas tout à fait: comment sur terre ne peut le constructeur statique de la classe String créer une instance de la classe String ? N'est-ce pas une sorte de "l'œuf ou la poule" scénario? – DrJokepu Fév 3 '09 à 17:12 5

Cette réponse serait exact pour pratiquement n'importe quelle autre classe, mais de Système.Chaîne de caractères. .NET fait beaucoup de performance spéciale-le carter de chaînes de caractères, et l'un d'eux est que vous POUVEZ avoir des constantes de chaîne, il suffit de l'essayer. Dans ce cas, Jeff Yates a la réponse correcte. – Joel Mueller Fév 3 '09 à 19:25

Comme décrit dans le §7.18, une constante-expression est une expression qui peut être entièrement évalués au moment de la compilation. Car la seule manière de créer une valeur non nulle de référence de type autre que la chaîne est d'appliquer le nouvel opérateur, et depuis le nouvel opérateur n'est pas autorisé dans une constante de l'expression, la seule valeur possible pour les constantes de référence-les types autres que la chaîne est nulle. Les deux précédents commentaires ont été prises directement à partir de la spécification du langage C# et réitérer ce que Joel Mueller mentionné. – senfo Fév 4 '09 à 15:05 5

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