Obtenir la valeur de Dictionnaire<string, object> sans unboxing?
Je me demandais si il est possible d'exécuter le code suivant mais sans l'unboxing de la ligne:-
t.Value = (T)x;
Ou peut-être si il ya une autre façon de faire ce genre d'opération?
Voici le code complet:-
public class ValueWrapper<T>
{
public T Value { get; set; }
public bool HasValue { get; set; }
public ValueWrapper()
{
HasValue = false;
}
}
class Program
{
static void Main(string[] args)
{
Dictionary<string, object> myDictionary = new Dictionary<string, object>();
myDictionary.Add("key1", 6);
myDictionary.Add("key2", "a string");
var x2 = GetValue<int>(myDictionary, "key1");
if (x2.HasValue)
Console.WriteLine("'{0}' = {1}", "key1", x2.Value);
else
Console.WriteLine("No value found");
Console.ReadLine();
}
static ValueWrapper<T> GetValue<T>(IDictionary<string, object> dictionary, string key)
{
ValueWrapper<T> t = new ValueWrapper<T>();
object x = null;
if (dictionary.TryGetValue(key, out x))
{
if (x.GetType() == typeof(T))
{
t.Value = (T)x;
t.HasValue = true;
}
}
return t;
}
}
Merci d'avance!!
Richard.
Non, si votre
Surtout pour la performance de mon projet où ce code est utilisé avec d'autres trucs de l'unboxing augmente le temps d'exécution d' ~200ms à ~1700ms. Ce qui est encore acceptable, je voulais juste savoir pour mon propre avantage, s'il existe une alternative.
Il est extrêmement peu probable que cela drastique de la dégradation des performances est due à unboxing. Utiliser un profiler pour déterminer quel est le véritable goulot d'étranglement.
object
est une boîte de type de valeur, alors il faut être "unboxed". Est-il une raison pourquoi vous voulez éviter les unboxing?Surtout pour la performance de mon projet où ce code est utilisé avec d'autres trucs de l'unboxing augmente le temps d'exécution d' ~200ms à ~1700ms. Ce qui est encore acceptable, je voulais juste savoir pour mon propre avantage, s'il existe une alternative.
Il est extrêmement peu probable que cela drastique de la dégradation des performances est due à unboxing. Utiliser un profiler pour déterminer quel est le véritable goulot d'étranglement.
OriginalL'auteur Richard Adnams | 2010-10-20
Vous devez vous connecter pour publier un commentaire.
Quelques commentaires:
t.Value = (T)x;
Le casting est nécessaire. C'est parce que
t.Value
est de typeT
etx
est de typeobject
. Fortement typées la nature de C# nécessite que vous dire au compilateur "regardez, je sais que cela peut dangereux, mais vous pouvez juste essayer de le faire pour moi, de toute façon, que ce soit par la conversion ou unboxing ou quoi? Merci!"2.
Que si
x
est une instance d'une classe qui dérive deT
? Ou six
est une instance d'une classe qui implémente une interface etT
est que l'interface? Maintenant, vous allez retourner une instance deValueWrapper<T>
que indique il n'y a pas d'objet dans le dictionnaire avec la clékey
. Je dirais que c'est très contre-intuitif de ce que la plupart des gens s'attendent.En outre, si vous n'êtes pas à l'envie de vomir quand
dictionary
ne contient pas une valeur correspondant à la clékey
, je pense que vous devez renommer votre méthode pourTryGetValue
, accepter uneout
paramètre de typeValueWrapper<T>
, et de retourner unebool
indiquant la réussite ou l'échec.3.
De répondre à votre commentaire, voici une solution.
Utilisation:
Vous aurez à ajouter de vérification des paramètres etc.
Il devrait être
out
au lieu deref
.Adnams: je doute conduisant à des problèmes de performances, mais vous ne pouvez savoir si vous profil. Veuillez voir mon montage pour une manière de résoudre le problème que vous essayez de résoudre, cependant.
Merci Jason, vous avez été d'une grande aide.. maintenant pour obtenir un café et de digérer cette :)!
OriginalL'auteur jason