Différence entre CultureInfo.CreateSpecificCulture () et le constructeur de la classe?

La classe CultureInfo fournit deux voies de création:

la documentation MSDN diffère légèrement pour les deux, mentionnant une certaine "culture Windows" pour le constructeur. Mais est-ce vraiment important?

dois-je préférer l'un des deux sur l'autre?

Note: J'Ai j'utilise la version 3.5 de .NET si cela compte, et je veux l'utiliser comme ceci:

Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture(culture);
Thread.CurrentThread.CurrentUICulture = new CultureInfo(culture);

décrit dans cette réponse.

26
demandé sur Community 2012-08-30 13:35:02

3 réponses

la méthode factory a un repli quand elle ne réussit pas à créer l'information de culture.

donc si vous utilisez une culture spécifique comme 'en-XX', l'instance culture info ne peut pas être créée, une exception sera lancée et un essai avec la culture neutre 'en' réussira.

en dessous du source la méthode

public static CultureInfo CreateSpecificCulture(string name)
{
    CultureInfo info;
    try
    {
        info = new CultureInfo(name);
    }
    catch (ArgumentException)
    {
        info = null;
        for (int i = 0; i < name.Length; i++)
        {
            if ('-' == name[i])
            {
                try
                {
                    info = new CultureInfo(name.Substring(0, i));
                    break;
                }
                catch (ArgumentException)
                {
                    throw;
                }
            }
        }
        if (info == null)
        {
            throw;
        }
    }
    if (!info.IsNeutralCulture)
    {
        return info;
    }
    return new CultureInfo(info.m_cultureData.SSPECIFICCULTURE);
}

donc je préfère la méthode de l'usine.

27
répondu Erwin 2015-06-25 15:54:59

ce fil a déjà été répondu mais je suis tombé sur une découverte unique pour L'API CreateSpecificCulture qui pourrait ne pas être si évidente à certains moments. Ainsi j'ai considéré ce fil pour être un endroit approprié pour mes conclusions. J'ai passé quelques jours sur cette si juste pensé à partager mon expérience si ça peut sauver quelques heures ou quelques jours pour les autres.

en utilisant L'API lorsque vous lui passez seulement le nom de la culture comme pt (pour le portugais) ou de (pour l'Allemand) cette API renvoie une culture correspondant à la locale qui est appelée locale par défaut pour cette culture. Ce lieu n'est peut-être pas aussi évident que l'endroit où j'ai été coincé. Pour L'Allemand, L' de-DE semble évident qui est l'allemand parlé en Allemagne. Pour L'Italien, Le it-IT semble évidente qui est l'italien parlé en Italie.

Idem pt-PT semble évident pour le portugais parlé au Portugal. Malheureusement, c'est le cas. En se fondant sur l'incertitude de la raison exacte (peut être la population, pays d'origine, langue nationale, etc.) il y a une standardisation globale sur la base de laquelle la localisation par défaut pour une culture donnée est déterminée lorsque vous essayez de créer une culture spécifique à partir d'un id de culture (pt dans ce cas). Microsoft a documenté la liste entière au lien suivant:

http://msdn.microsoft.com/en-us/goglobal/bb896001.aspx

si vous voulez savoir quel est le lieu de pays par défaut pour une culture ou une langue donnée il suffit de faire correspondre dernière colonne (abréviation du nom de la langue) code dans le lien ci-dessus.

pour le portugais, le nom de la langue abbrevitaion de la culture invariante" Portugais "correspond à" portugais (Brésil) " qui est PTB. Le portugais (Portugal) a un code différent PTG. Ainsi, dans ce cas, le portugais (Brésil) est la langue locale par défaut pour la langue portugaise.

si la logique ou les exigences de votre application dépendent d'une manière ou d'une autre de ce comportement de cette API, vous devez être prudent. Ce comportement est d'autant plus important dans les applications web que tous les navigateurs sur le marché suivent également ces directives et envoient les informations appropriées dans l'en-tête de requête http lorsque vous consultez une version localisée d'un site web multilingue.

je cherche encore la raison qui est facteur derrière la définition d'un pays spécifique comme lieu par défaut pour toute culture qui ne semble pas si évidente dans le cas du portugais. Toute information ou commentaires sont les bienvenus.

5
répondu RBT 2018-02-12 05:50:49

il y a une autre différence notable entre la méthode factory et le contructor: le constructeur offre un booléen optionnel supplémentaire, qui a sa valeur par défaut définie à true.

Vous aurez besoin de ce Booléen à false, si vous avez vraiment besoin d'un >"plaine"< cultureinfo, parce que: Si vous demandez une culture spécifique (par exemple,de-DE) sans "Boolean set to false" vous obtiendrez toujours un paramètre de culture, qui pourrait avoir des paramètres inattendus, selon la façon dont l'Utilisateur a changé cette culture via le Panneau de contrôle.

la méthode factory ne supporte pas ce booléen !!!

juste deux dernières réflexions sur quand vous voulez que ce booléen soit:

  • vrai: Vous êtes à la génération de la sortie pour vous à l'INTERFACE utilisateur Cette Sortie doit être en fonction de la Culture de réglage des Paramètres, l'utilisateur a choisi via le Panneau de commande
  • false: vous voulez analyser des données (par exemple à partir de XML) et vous connaissez les paramètres spécifiques XML-culture (par exemple séparateur décimal comme virgule). Dans ce cas, vous aurez besoin d'un plain de-DE - Culture pour être sûr que le réglage spécial du panneau de contrôle n'interférerait pas.
1
répondu Rüdiger 2018-09-17 21:49:51