Что означает "@" char перед именем параметра в объявлении метода?

Возможные дубликаты:
Что означает символ @перед именем переменной в С#?
В чем смысл/смысл символа @в именах переменных на С#?

Привет,

У меня есть один быстрый вопрос. Что означает "@" char перед именем параметра в объявлении метода? Пример:

protected void Method1(Type1 @arg1, Type2 arg2)
...

Я использую С# с .net 3.5.

Спасибо.

Ответы

Ответ 1

Он позволяет использовать зарезервированные слова в качестве идентификаторов. Он обычно используется генераторами кода, которые могут использовать имена источников из систем с разными ключевыми словами, чем целевой язык, например. имена таблиц и имена аргументов sproc.

Ответ 2

Это способ избежать идентификатора.

например. следующие два эквивалентны:

protected void Method1(Type1 @arg1, Type2 arg2)
protected void Method1(Type1 arg1, Type2 arg2)

@ действительно полезно, если вам нужно указать идентификатор после ключевого слова. Ниже не будет компилироваться без @:

protected void Method1(Type1 @class, Type2 arg2)

Ответ 3

Используется для зарезервированных слов в качестве параметров. Пример:

string @string = "abc";

или

string @class = "foo";

arg1 не является зарезервированным словом, поэтому использование @ не требуется. При этом использование зарезервированных слов для определения ваших параметров не является хорошей идеей. Бывают случаи, когда это полезно. Например, в ASP.NET MVC некоторые методы расширения HTML принимают анонимный объект в качестве параметра для извлечения атрибутов html. Итак, у вас есть синтаксис:

<%= Html.ActionLink("text", "action", "controller", null, new { @class = "abc" }) %>

который генерирует:

<a href="/controller/action" class="abc">text</a>

Ответ 4

В вашем конкретном примере это не имеет значения. В С# символ @используется для исключения ключевых слов, чтобы их можно было использовать как имена переменных.

Например, следующее генерирует ошибку компилятора:

public void Test(string class){...}

Но если вы сбегаете с @, это нормально:

public void Test(string @class){...}