748 Stimmen

Was bedeutet das @ vor einer Zeichenkette in C#?

Dies ist eine .NET-Frage für C# (oder möglicherweise VB.net), aber ich versuche, herauszufinden, was ist der Unterschied zwischen den folgenden Deklarationen:

string hello = "hello";

vs.

string hello_alias = @"hello";

Der Ausdruck auf der Konsole macht keinen Unterschied, die Längeneigenschaften sind dieselben.

949voto

Richard Ev Punkte 50770

Es markiert die Zeichenkette als wortwörtliches String-Wort - alles in der Zeichenkette, was normalerweise als Escape-Sequenz wird ignoriert.

だから "C:\\Users\\Rich" ist dasselbe wie @"C:\Users\Rich"

Es gibt eine Ausnahme: Für das doppelte Anführungszeichen ist eine Escape-Sequenz erforderlich. Um ein doppeltes Anführungszeichen zu entkommen, müssen Sie zwei doppelte Anführungszeichen hintereinander setzen. Zum Beispiel, @"""" wertet aus zu " .

297voto

Jon Skeet Punkte 1325502

Es ist ein wortwörtliches String-Wort . Das bedeutet, dass die Fluchtfunktion nicht angewendet wird. Zum Beispiel:

string verbatim = @"foo\bar";
string regular = "foo\\bar";

Aquí verbatim y regular haben den gleichen Inhalt.

Es erlaubt auch mehrzeilige Inhalte, was für SQL sehr praktisch sein kann:

string select = @"
SELECT Foo
FROM Bar
WHERE Name='Baz'";

Das einzige Stück Escaping, das für wortwörtliche String-Literale notwendig ist, ist ein doppeltes Anführungszeichen ("), das Sie durch Verdoppelung erreichen:

string verbatim = @"He said, ""Would you like some coffee?"" and left.";
string regular = "He said, \"Would you like some coffee?\" and left.";

74voto

JulianR Punkte 15805

Ein '@' hat auch noch eine andere Bedeutung: Wenn Sie es vor eine Variablendeklaration setzen, können Sie reservierte Schlüsselwörter als Variablennamen verwenden.

Zum Beispiel:

string @class = "something";
int @object = 1;

Ich habe nur ein oder zwei legitime Verwendungszwecke dafür gefunden. Hauptsächlich in ASP.NET MVC, wenn Sie so etwas tun möchten:

<%= Html.ActionLink("Text", "Action", "Controller", null, new { @class = "some_css_class" })%>

Das würde einen HTML-Link wie diesen ergeben:

<a href="http://stackoverflow.com/Controller/Action" class="some_css_class">Text</a>

Andernfalls müssten Sie "Class" verwenden, das zwar kein reserviertes Schlüsselwort ist, aber das in Großbuchstaben geschriebene "C" entspricht nicht den HTML-Standards und sieht einfach nicht richtig aus.

19voto

Konrad Rudolph Punkte 503837

Da Sie ausdrücklich auch nach VB gefragt haben, möchte ich nur hinzufügen, dass es diese wortwörtliche Stringsyntax in VB nicht gibt, sondern nur in C#. Vielmehr, alle Strings sind in VB wortwörtlich (mit Ausnahme der Tatsache, dass sie keine Zeilenumbrüche enthalten können, im Gegensatz zu C# wortwörtlichen Strings):

Dim path = "C:\My\Path"
Dim message = "She said, ""Hello, beautiful world."""

Escape-Sequenzen gibt es in VB nicht (abgesehen von der Verdoppelung des Anführungszeichens, wie in C# verbatim strings), was einige Dinge komplizierter macht. Um zum Beispiel den folgenden Code in VB zu schreiben, müssen Sie die Verkettung verwenden (oder eine der anderen Möglichkeiten, eine Zeichenkette zu konstruieren)

string x = "Foo\nbar";

In VB würde dies wie folgt geschrieben werden:

Dim x = "Foo" & Environment.NewLine & "bar"

( & ist der VB-String-Verkettungsoperator. + könnte ebenfalls verwendet werden).

12voto

Ed Guiness Punkte 33920

http://msdn.microsoft.com/en-us/library/aa691090.aspx

C# unterstützt zwei Formen von String-Literalen: reguläre String-Literale und Verbatim-String-Literale.

Ein reguläres Zeichenkettenliteral besteht aus null oder mehr Zeichen, die in doppelte Anführungszeichen eingeschlossen sind, wie in "Hallo", und kann sowohl einfache Escape-Sequenzen (wie \t für das Tabulatorzeichen) sowie hexadezimale und Unicode-Escape-Sequenzen.

Ein wortwörtliches Zeichenfolgenliteral besteht aus einem @-Zeichen, gefolgt von einem Anführungszeichen, null oder mehr Zeichen und einem abschließenden Anführungszeichen. Ein einfaches Beispiel ist @"hallo". In einem wortgetreuen Zeichenfolgenliteral werden die Zeichen zwischen den Begrenzungszeichen wortgetreu interpretiert, einzige Ausnahme ist eine Anführungszeichen-escape-Sequenz. Insbesondere einfache Escape-Sequenzen sowie hexadezimale und Unicode-Escape-Sequenzen werden in verbatim-Stringliteralen nicht verarbeitet. Ein wortgetreues Zeichenfolgenliteral kann sich über mehrere Zeilen erstrecken.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X