2013-03-20 17 views
11

nota, sono consapevole delle seguenti domande su questo argomento:prestazioni durante l'utilizzo delle risorse di file (.resx)

  1. Are there any performance issues or caveats with resource (.resx) files?

  2. Are string resources (.resx) properties kept in memory?

et al. Tuttavia, non trovo soddisfacenti le risposte a queste domande (non sono abbastanza concrete).

Sono anche a conoscenza delle pagine MSDN su questo argomento, ma anche queste sembrano ignorare le informazioni tecniche relative ai costi generali dell'utilizzo dei file di risorse.


La mia situazione è che stiamo per intraprendere la localizzazione di un'applicazione WinForms di dimensioni ragionevoli. La mia preoccupazione in questa fase riguarda le prestazioni di accesso alle risorse da un file .resx da un ciclo annidato, ad esempio. Attualmente per la piccola parte del codice che abbiamo localizzato (nomi di colonne, intestazioni di riga ecc. Per DataGridView ecc.) Stiamo incassando le risorse nelle variabili globali della classe rilevante e usando quelle.

In che modo le risorse da .resx sono accessibili (sono incluse nell'assembly in fase di compilazione?) E c'è un vantaggio in termini di prestazioni dall'incassare tali risorse e dall'utilizzo di variabili globali per l'accesso?

risposta

14

Le risorse di stringa sono memorizzate nella cache. Guarda il codice generato in "Resources.Designer.cs".

Utilizza uno System.Resources.ResourceManager e questo fa il caching delle stringhe.

Nota anche this ResourceManager constructor. Ricorda che puoi cambiare strategia di caching:

Questo costruttore utilizza l'implementazione ResourceSet fornita dal sistema. Per utilizzare un formato di file di risorse personalizzato, è necessario derivare dalla classe ResourceSet, sovrascrivere i metodi GetDefaultReader e GetDefaultWriter e passare tale tipo al costruttore ResourceManager (String, Assembly, Type). L'utilizzo di un ResourceSet personalizzato può essere utile per controllare il criterio di caching delle risorse o supportare il proprio formato di risorsa , ma in genere non è necessario.

(corsivo mio)

Il documentation for ResourceSet dice esplicitamente:

classe

Il ResourceSet enumera su un IResourceReader, il caricamento di ogni nome e valore, e la loro memorizzazione in una Hashtable

Quindi conosciamo il caching stra esatto Tegy che otterrai per impostazione predefinita.

[EDIT] Dal momento che non sembra credermi!:)

(1) Consultare la documentazione del costruttore ResourceManager(string baseName,Assembly assembly). Essa afferma:

Questo costruttore utilizza l'implementazione ResourceSet fornito dal sistema.

(2) Ora guardate la documentation for ResourceSet. Essa afferma:

classe

Il ResourceSet enumera su un IResourceReader, il caricamento di ogni nome e valore, e la loro memorizzazione in una Hashtable.

Quindi questo comportamento della cache è infatti documentato in MSDN, e inoltre è possibile verificare che questo è ciò che sta accadendo utilizzando ReSharper per ispezionare l'attuazione.

+0

+1 Grazie mille per la risposta. Più apprezzato Puoi spiegare un'altra cosa per me. Per chiamare una risorsa da [MSDN docs] (http://msdn.microsoft.com/en-us/library/yfsz7ac5.aspx) facciamo 'ResourceManager rm = new ResourceManager (" ExampleResources ", typeof (Example) .Assembly); string greeting = rm.GetString ("Saluto"); 'ma capisco da http://stackoverflow.com/a/1142840/626442 che questo può essere fatto anche tramite' Console.WriteLine (stringhe.Oloro); 'dove il file di risorse è 'strings.resx'. Qual è la differenza? – MoonKnight

+0

Potete aiutarmi con questa domanda: http://stackoverflow.com/questions/15523604/error-in-generation-of-resource-resource-design-cs-file – MoonKnight

+1

L'uso di 'strings.ello' sta semplicemente usando il- classe generata in 'Resources.Designer.cs' –

Problemi correlati