Чтобы приступить к исследованию ключевого слова dynamic
DynamicKeyword. Добавьте в класс Program следующий метод и удостоверьтесь, что финальный оператор кода на самом деле генерирует ошибку на этапе компиляции, если убрать символы комментария:static void ImplicitlyTypedVariable()
{
// Переменная а имеет тип List
var a = new List
// Этот оператор приведет к ошибке на этапе компиляции!
// a = "Hello";
}
Использование неявной типизации лишь потому, что она возможна, некоторые считают плохим стилем (если известно, что необходима переменная типа List
В качестве связанного замечания: в главе 6 упоминалось, что System.Object
object в результате дает строго типизированный фрагмент данных, но то, на что указывает эта переменная в памяти, может отличаться в зависимости от присваиваемой ссылки. Чтобы получить доступ к членам объекта, на который указывает ссылка в памяти, понадобится выполнить явное приведение.Предположим, что есть простой класс по имени Person
FirstName и LastName), инкапсулирующие данные string. Взгляните на следующий код:static void UseObjectVariable()
{
// Пусть имеется класс по имени Person.
object o = new Person() { FirstName = "Mike", LastName = "Larson" };
// Для получения доступа к свойствам Person
. // переменную о потребуется привести к Person
Console.WriteLine("Person's first name is {0}", ((Person)o).FirstName);
}
А теперь возвратимся к ключевому слову dynamic
dynamic можно трактовать как специализированную форму типа System.Object — в том смысле, что переменной динамического типа данных может быть присвоено любое значение. На первый взгляд это может привести к серьезной путанице, поскольку теперь получается, что доступны три способа определения данных, внутренний тип которых явно не указан в кодовой базе. Например, следующий метод:static void PrintThreeStrings()
{
var s1 = "Greetings";
object s2 = "From";
dynamic s3 = "Minneapolis";
Console.WriteLine("s1 is of type: {0}", s1.GetType());
Console.WriteLine("s2 is of type: {0}", s2.GetType());
Console.WriteLine("s3 is of type: {0}", s3.GetType());
}
в случае вызова приведет к такому выводу:
s1 is of type: System.String
s2 is of type: System.String
s3 is of type: System.String
Динамическая переменная и переменная, объявленная неявно или через ссылку на System.Object
dynamic, можно присваивать вообще любое начальное значение, и на протяжении периода его существования взамен начального значения может быть присвоено любое новое (возможно, не связанное) значение. Рассмотрим показанный ниже метод и результирующий вывод:static void ChangeDynamicDataType()
{
// Объявить одиночный динамический элемент данных по имени t
. dynamic t = "Hello!";
Console.WriteLine("t is of type: {0}", t.GetType());
t = false;
Console.WriteLine("t is of type: {0}", t.GetType());
t = new List