2011-02-10 8 views
6

Me encontré con un error que me molestaba. Tenía JObject que pensé que estaría bien con.ToString(), (cadena) o como cadena. Cuándo usar qué?

obj["role"].ToString() 

La cadena estaba allí y todo. Un último recurso era cambiar a un

(string)obj["role"] 

solo para ver qué pasa y funciona. Mi pregunta es cómo sé cuándo usar un .ToString() en lugar de un (cadena) en lugar de un "como cadena".

Respuesta

17

Si el objeto es un string, o hay un operador de conversión explícita a (string), entonces es bien decir

string s = (string)obj["role"]; 

De lo contrario, esto le dará una InvalidCastException.

Tenga en cuenta que aquí se podría decir

string s = obj["role"] as String; 

que se establece s a null si obj["role"] no es una instancia de string. Tenga en cuenta que para as, los operadores de conversión explícitos se ignoran.

Si obj["role"] no es ni una ni string una instancia de una clase que tiene un operador de conversión explícita a string, que tiene que decir

string s = obj["role"].ToString(); 

Pero cuidado, este último puede lanzar una NullReferenceException.

+0

Todos los objetos en .Net heredar de 'System.Object' que tiene un método' .ToString() '- Todavía tengo que encontrar un objeto que va a lanzar una referencia nula simplemente para llamar' .ToString() 'en it - Antes de I -1, ¿puedes dar un ejemplo? – Basic

+7

@Basiclife:. Si 'obj [ "papel"]' 'es null', entonces' obj [ "papel"] ToString() '' va a lanzar una NullReferenceException' porque estamos tratando de eliminar la referencia a una 'referencia null'. – jason

+0

He visto código como 'string s = (obj [" role "] ?? string.Empty) .ToString();' para evitar la 'NullReferenceException'. No pude decir si es una buena práctica o no. –

1

(string) lanza la instancia a la cadena y podría throw an exception en tiempo de ejecución si el objeto que intentas lanzar no es una cadena. El operador as también intenta lanzar, pero no lanza una excepción si la instancia no es una cadena pero devuelve nulo. Y el método ToString, por supuesto, proviene de System.Object, por lo que dependerá de si el tipo subyacente lo ha anulado.

0

No debería hacer una diferencia en su ejemplo. El único escenario en el que marcaría la diferencia es si existe una conversión de tipo de usuario (a string) definida en el tipo obj["role"]. En ese caso, es posible que el lanzamiento a string lo haya cambiado a un objeto diferente, sobre el cual el .ToString() se implementó de manera diferente.

Cuestiones relacionadas