Прямое приведение против оператора "как"? - PullRequest
651 голосов
/ 25 сентября 2008

Рассмотрим следующий код:

void Handler(object o, EventArgs e)
{
   // I swear o is a string
   string s = (string)o; // 1
   //-OR-
   string s = o as string; // 2
   // -OR-
   string s = o.ToString(); // 3
}

В чем разница между тремя типами кастинга (хорошо, третий не кастинг, но вы получаете намерение). Какой из них должен быть предпочтительным?

Ответы [ 17 ]

3 голосов
/ 03 апреля 2014

Все приведенные ответы хороши, если бы я мог добавить что-то: Чтобы напрямую использовать методы и свойства строки (например, ToLower), вы не можете написать:

(string)o.ToLower(); // won't compile

Вы можете только написать:

((string)o).ToLower();

но вы могли бы написать вместо:

(o as string).ToLower();

Опция as более читабельна (по крайней мере, на мой взгляд).

3 голосов
/ 25 сентября 2008
string s = o as string; // 2

Предпочтительнее, поскольку позволяет избежать потери производительности при двойном литье.

1 голос
/ 17 октября 2018

Я хотел бы обратить внимание на следующие особенности как оператора :

https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/keywords/as

Обратите внимание, что оператор as выполняет только эталонные преобразования, Обнуляемые преобразования и преобразования в бокс. Оператор как не может выполнять другие преобразования, такие как пользовательские преобразования, которые вместо этого следует выполнять с использованием приведенных выражений.

0 голосов
/ 27 мая 2018

Следующие две формы преобразования типов (приведение) поддерживаются в C #:

|

(C) v

• Преобразовать статический тип v в c в данном выражении

• Возможно, только если динамический тип v равен c или подтип c

• Если нет, генерируется исключение InvalidCastException

|

v как C

• Не смертельный вариант (c) v

• Таким образом, преобразуйте статический тип v в c в данном выражении

• Возвращает ноль, если динамический тип v не c или подтип c

0 голосов
/ 03 августа 2017

Используйте прямое приведение string s = (string) o;, если в логическом контексте вашего приложения string является единственным допустимым типом. При таком подходе вы получите InvalidCastException и реализуете принцип Fail-fast . Ваша логика будет защищена от дальнейшей передачи недопустимого типа или получения исключения NullReferenceException, если используется оператор as.

Если логика ожидает несколько различных типов, приведите string s = o as string; и отметьте null или используйте оператор is.

В C # 7.0 появилась новая классная функция для упрощения приведения и проверки Соответствие шаблону :

if(o is string s)
{
  // Use string variable s
}

or

switch (o)
{
  case int i:
     // Use int variable i
     break;
  case string s:
     // Use string variable s
     break;
 }
0 голосов
/ 13 октября 2015

Поскольку никто не упомянул об этом, наиболее близким к instanceOf для Java по ключевому слову является:

obj.GetType().IsInstanceOfType(otherObj)
0 голосов
/ 23 июня 2012

При попытке получить строковое представление чего-либо (любого типа), которое потенциально может быть нулевым, я предпочитаю приведенную ниже строку кода. Он компактен, вызывает ToString () и правильно обрабатывает нули. Если o равно null, s будет содержать String.Empty.

String s = String.Concat(o);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...