#.net #dynamic #c#-4.0
#.net #динамический #c #-4.0
Вопрос:
Я все еще не обновился до 4.0, иначе я бы сам проверил фрагмент кода. Но я надеюсь, что какой-нибудь эксперт сможет прокомментировать это.
В следующем коде будет ли вызываться соответствующий Print()
метод во время выполнения? Законно ли вообще в C # 2010 называть это таким образом?
public void Test()
{
dynamic objX = InstantiateAsStringOrDouble();
Print(objX);
}
public void Print(string s)
{
Console.Write("string");
}
public void Print(double n)
{
Console.Write("double");
}
Спасибо!
Комментарии:
1. Как бы вы хотели, чтобы это решало, какую печать вызывать? Я думаю, вам было бы лучше прочитать больше о
dynamic
.2. во время выполнения, конечно. Спасибо за ваш совет, я это уже делаю! 🙂
3. Это действительно работает, но будьте осторожны с dynamic. Это может решить множество проблем и одновременно доставить вам массу головной боли 🙂 по сути, вы получаете гибкость во время выполнения, но теряете все время компилятора на проверку.
Ответ №1:
Да, это действительно работает. Это проверит использование dynamic во время выполнения и вызовет соответствующий метод, однако вы потеряете почти всю проверку во время компиляции, поэтому я бы удостоверился, что это действительно то, что вы хотели бы сделать.
Комментарии:
1. Спасибо, Джеймс. Код, который я пытаюсь преобразовать, содержит вызовы методов глубиной 3-4 уровня с передачей параметров объекта в штучной упаковке. Я думал о написании перегруженных методов, но это похоже на некоторую логику if-else, затем на вызов метода, больше логики if-else, чем на другой вызов метода (передача того же параметра объекта, который он получает с 2-3 уровней вверх)…. Своего рода боль в шее от устаревшего кода. Где-то внизу он проверяет, является ли объект ArrayList или HashTable или бла-бла-бла, и действует соответствующим образом.
Ответ №2:
Да, и вы даже можете сделать это:
public dynamic InstantiateAsStringOrDouble() { return 0.5; }
или
public dynamic InstantiateAsStringOrDouble() { return "hello"; }
и это будет работать так, как ожидалось.
Комментарии:
1. И, конечно,
public dynamic ... { return true; }
, вероятно, не сработает.