コード例 #1
0
ファイル: Program.cs プロジェクト: SpektrEG/DynamicTypes
        // Статическая и динамическая типизация
        static void F4()
        {
            // При создании неявно типизированной локальной переменной var ёё тип фиксируется в момент инициализации
            var v0 = string.Empty;
            Console.WriteLine("the type of v0 is: {0}, value is: {1}", v0.GetType(), v0);
            v0 = "qwerty";
            Console.WriteLine("the type of v0 is: {0}, value is: {1}", v0.GetType(), v0);
            // v0 = 125; // Присвоение начений другого типа недопустимо.
            v0 = 125.ToString();

            // Переменная типа object может получить начальное значение любого типа.
            // на протяжении времени существования объекта это значение может быть заменено новым значением любого типа. Почему это так?
            object obj;
            obj = "Hello!";
            Console.WriteLine("the type of obj is: {0}, value is: {1}", obj.GetType(), obj);
            obj = false;
            Console.WriteLine("the type of obj is: {0}, value is: {1}", obj.GetType(), obj);
            // Компилятором допускается изменение значения.
            // В конкретном случае - значения поля Z.
            // Даже если этого поля не было и нет! Все проблемы вознакают на этапе выполнения кода.
            // ((Point3D)obj).Z = 125.125;
            // Во избежание генерации исключения требуется:
            // 1. явное корректное приведение типа,
            // 2. по ссылке на obj должен быть объект соответсвующего типа.
            // В данном случае транслятор допустит оператор присвоения к выполнению, поскольку класс Point3D
            // объявление свойства Z типа double
            // Однако на этапе выполнения возникает исключение, посколько в данный момент obj ссылается на объект
            obj = new Point3D();
            ((Point3D)obj).Z = 125.125;
            Console.WriteLine("the type of obj is: {0}, value is: {1}", obj.GetType(), obj);

            // Объявлена переменная типа dynamic по имени t.
            // Аналогично, t может получить какое угодно начальное занчение, и на протяэении времени существования переменной это значение может быть заменено новым.
            dynamic t = "Hello!";
            Console.WriteLine("the type of t is: {0}, value is: {1}", t.GetType(), t);

            t = false;
            Console.WriteLine("the type of t is: {0}, value is: {1}", t.GetType(), t);

            t = new Point2D();
            Console.WriteLine("the type of t is: {0}, value is: {1}", t.GetType(), t);

            t.Y = Math.E;
            Console.WriteLine("the type of t is: {0}, value is: {1}", t.GetType(), t);

            try
            {
                t.qwerty = "йцукен";
            }
            catch(Microsoft.CSharp.RuntimeBinder.RuntimeBinderException ex)
            {
                Console.WriteLine(ex.Message);
            }
        }
コード例 #2
0
ファイル: Point3D.cs プロジェクト: SpektrEG/DynamicTypes
 public Point3D(Point3D p)
 {
     this.x = p.X;
     this.y = p.Y;
     this.z = p.Z;
 }