recortar - ¿Qué es la @ delante de una cadena en C#?
quitar caracteres especiales c# (10)
Como también solicitó explícitamente VB, permítame agregar que esta sintaxis de cadena textual no existe en VB, solo en C #. Más bien, todas las cadenas son textuales en VB (excepto por el hecho de que no pueden contener saltos de línea, a diferencia de las cadenas textuales de C #):
Dim path = "C:/My/Path"
Dim message = "She said, ""Hello, beautiful world."""
Las secuencias de escape no existen en VB (a excepción de la duplicación del carácter de cita, como en las cadenas textuales de C #) lo que hace que algunas cosas sean más complicadas. Por ejemplo, para escribir el siguiente código en VB debe usar concatenación (o cualquiera de las otras formas de construir una cadena)
string x = "Foo/nbar";
En VB esto se escribiría de la siguiente manera:
Dim x = "Foo" & Environment.NewLine & "bar"
( &
es el operador de concatenación de cadenas VB. +
podría utilizarse igualmente).
Esta es una pregunta de .NET para C # (o posiblemente VB.net), pero estoy tratando de averiguar cuál es la diferencia entre las siguientes declaraciones:
string hello = "hello";
contra
string hello_alias = @"hello";
Imprimir en la consola no hace ninguna diferencia, las propiedades de longitud son las mismas.
Copiado de MSDN :
En el momento de la compilación, las cadenas textuales se convierten en cadenas normales con todas las mismas secuencias de escape. Por lo tanto, si ve una cadena textual en la ventana de vigilancia del depurador, verá los caracteres de escape que agregó el compilador, no la versión textual de su código fuente. Por ejemplo, la cadena textual
@"C:/files.txt"
aparecerá en la ventana de visualización como"C://files.txt"
.
Es una cadena literal . Significa que escapar no se aplica. Por ejemplo:
string verbatim = @"foo/bar";
string regular = "foo//bar";
Aquí verbatim
y regular
tienen los mismos contenidos.
También permite contenidos de varias líneas, lo que puede ser muy útil para SQL:
string select = @"
SELECT Foo
FROM Bar
WHERE Name=''Baz''";
El bit de escape que es necesario para los literales de cadena textuales es obtener una comilla doble ("), lo que hace al duplicarlo:
string verbatim = @"He said, ""Would you like some coffee?"" and left.";
string regular = "He said, /"Would you like some coffee?/" and left.";
Esta es una cadena textual, y cambia las reglas de escape, el único carácter que ahora se escapa es ", escapado a" ". Esto es especialmente útil para rutas de archivos y expresiones regulares:
var path = @"c:/some/location";
var tsql = @"SELECT *
FROM FOO
WHERE Bar = 1";
var escaped = @"a "" b";
etc
La explicación es simple. Para representar la cadena "string/"
, el compilador necesita "string//"
porque /
es un carácter de escape. Si usa @"string/"
lugar, puede olvidarse de //
.
Marca la cadena como una cadena literal literal : se ignora cualquier cosa en la cadena que normalmente se interpretaría como una secuencia de escape .
Así que "C://Users//Rich"
es lo mismo que @"C:/Users/Rich"
Hay una excepción: se necesita una secuencia de escape para la comilla doble. Para escapar de una comilla doble, debe poner dos comillas dobles seguidas. Por ejemplo, @""""
evalúa como "
.
Poner una "@" delante de cualquier cadena la convierte en una cadena literal. Un mejor ejemplo sería
string String1 = "Hello"";
y
string String2 = @"Hello/"";
El primero será un error de sintaxis, mientras que el segundo imprimirá Hola ".
Poner una @
delante de una cadena le permite usar caracteres especiales como una barra invertida o comillas dobles sin tener que usar códigos especiales o caracteres de escape.
Así que puedes escribir:
string path = @"C:/My path/";
en lugar de:
string path = "C://My path//";
Un ''@'' también tiene otro significado: ponerlo delante de una declaración de variable le permite usar palabras clave reservadas como nombres de variable.
Por ejemplo:
string @class = "something";
int @object = 1;
Solo he encontrado uno o dos usos legítimos para esto. Principalmente en ASP.NET MVC cuando quieres hacer algo como esto:
<%= Html.ActionLink("Text", "Action", "Controller", null, new { @class = "some_css_class" })%>
Lo que produciría un enlace HTML como:
<a href="/Controller/Action" class="some_css_class">Text</a>
De lo contrario, tendría que usar ''Clase'', que no es una palabra clave reservada pero la ''C'' mayúscula no sigue los estándares HTML y simplemente no se ve bien.
http://msdn.microsoft.com/en-us/library/aa691090.aspx
C # admite dos formas de literales de cadena: literales de cadena regulares y literales de cadena textual.
Un literal de cadena normal consta de cero o más caracteres entre comillas dobles, como en "hola", y puede incluir tanto secuencias de escape simples (como / t para el carácter de tabulación) como secuencias de escape hexadecimales y Unicode.
Una cadena literal literal consiste en un carácter @ seguido de un carácter de comillas dobles, cero o más caracteres y un carácter de comillas dobles de cierre. Un ejemplo simple es @ "hola". En un literal literal de cadena, los caracteres entre los delimitadores se interpretan textualmente, la única excepción es una secuencia de escape-cita. En particular, las secuencias de escape simples y las secuencias de escape hexadecimales y Unicode no se procesan en series literales literales. Un literal de cadena textual puede abarcar varias líneas.