C# 使用动态语言运行时(DLR)安全吗?如何在DLR中更改值类型?

C# 使用动态语言运行时(DLR)安全吗?如何在DLR中更改值类型?,c#,dynamic,dynamic-language-runtime,C#,Dynamic,Dynamic Language Runtime,正如我最近发现的DLR一样,我认为可以在运行时轻松地更改值类型。运行时是否会出现内存问题或异常?DLR如何在没有任何异常和/或内存错误的情况下更改该值?更改值后对象的地址是否相同?旧值/对象及其地址/引用会发生什么变化 dynamic dyn = "String"; Console.Write(dyn); dyn = 123; Console.Write(dyn * 2); dyn = new Action<string>(Test); dyn("ABC"); stati

正如我最近发现的DLR一样,我认为可以在运行时轻松地更改值类型。运行时是否会出现内存问题或异常?DLR如何在没有任何异常和/或内存错误的情况下更改该值?更改值后对象的地址是否相同?旧值/对象及其地址/引用会发生什么变化

dynamic dyn = "String";

Console.Write(dyn);

dyn = 123;

Console.Write(dyn * 2);

dyn = new Action<string>(Test);

dyn("ABC");

static void Test(string t)
{
    Console.WriteLine(t);
}
dynamic dyn=“String”;
控制台写入(dyn);
dyn=123;
控制台写入(dyn*2);
dyn=新动作(测试);
戴恩(“ABC”);
静态孔隙试验(管柱t)
{
控制台写入线(t);
}

在您的代码中
dyn
包含一个引用,每次重新分配
dyn
时,您都会重新分配此引用。如果不存在对该对象的其他引用,则在重新分配之前引用的任何
dyn
现在都可以被垃圾收集。当您将值类型分配给
动态
时,该值将被装箱,因此
dyn=123
将在堆上创建一个装箱的int,当
dyn
被重新分配时,该装箱的int可以被垃圾回收

dynamic
所做的是,调用的任何涉及
dynamic
variabled的方法都是在运行时根据变量引用的对象的运行时类型来确定的,而不是“普通”C 35;,其中方法是在编译时确定的,或者是一个简单的虚拟方法表查找。如果你试图做一些不可能的事情,你会得到一个异常,但这是使用
动态
时所期望的


总之,一个
动态
变量包含一个引用,就像任何其他引用类型的变量一样。但是,使用
动态
变量时生成的代码非常不同,因为调用的实际方法只能在运行时确定。

在您的代码
dyn
中包含一个引用,并且每次重新分配
dyn
时都重新分配此引用。如果不存在对该对象的其他引用,则在重新分配之前引用的任何
dyn
现在都可以被垃圾收集。当您将值类型分配给
动态
时,该值将被装箱,因此
dyn=123
将在堆上创建一个装箱的int,当
dyn
被重新分配时,该装箱的int可以被垃圾回收

dynamic
所做的是,调用的任何涉及
dynamic
variabled的方法都是在运行时根据变量引用的对象的运行时类型来确定的,而不是“普通”C 35;,其中方法是在编译时确定的,或者是一个简单的虚拟方法表查找。如果你试图做一些不可能的事情,你会得到一个异常,但这是使用
动态
时所期望的


总之,一个
动态
变量包含一个引用,就像任何其他引用类型的变量一样。但是,使用
动态
变量时生成的代码非常不同,因为调用的实际方法只能在运行时确定。

在您的代码
dyn
中包含一个引用,并且每次重新分配
dyn
时都重新分配此引用。如果不存在对该对象的其他引用,则在重新分配之前引用的任何
dyn
现在都可以被垃圾收集。当您将值类型分配给
动态
时,该值将被装箱,因此
dyn=123
将在堆上创建一个装箱的int,当
dyn
被重新分配时,该装箱的int可以被垃圾回收

dynamic
所做的是,调用的任何涉及
dynamic
variabled的方法都是在运行时根据变量引用的对象的运行时类型来确定的,而不是“普通”C 35;,其中方法是在编译时确定的,或者是一个简单的虚拟方法表查找。如果你试图做一些不可能的事情,你会得到一个异常,但这是使用
动态
时所期望的


总之,一个
动态
变量包含一个引用,就像任何其他引用类型的变量一样。但是,使用
动态
变量时生成的代码非常不同,因为调用的实际方法只能在运行时确定。

在您的代码
dyn
中包含一个引用,并且每次重新分配
dyn
时都重新分配此引用。如果不存在对该对象的其他引用,则在重新分配之前引用的任何
dyn
现在都可以被垃圾收集。当您将值类型分配给
动态
时,该值将被装箱,因此
dyn=123
将在堆上创建一个装箱的int,当
dyn
被重新分配时,该装箱的int可以被垃圾回收

dynamic
所做的是,调用的任何涉及
dynamic
variabled的方法都是在运行时根据变量引用的对象的运行时类型来确定的,而不是“普通”C 35;,其中方法是在编译时确定的,或者是一个简单的虚拟方法表查找。如果你试图做一些不可能的事情,你会得到一个异常,但这是使用
动态
时所期望的


总之,一个
动态
变量包含一个引用,就像任何其他引用类型的变量一样。但是,使用
动态
变量时生成的代码非常不同,因为调用的实际方法只能在运行时确定。

它是安全的

在引擎盖下,类型为
dynamic
的变量实际上具有类型
object
。因此,当您将
“String”
123
新操作(…)
分配给它时,没有什么特别的事情发生。您可能已经知道,您可以轻松地对任何
对象
变量执行相同的操作。唯一的魔法就是对值类型的值(例如,
123
)进行装箱,但同样地
dynamic a = 123;
Console.WriteLine(a * 2); // OK

dynamic b = "123";
Console.WriteLine(b * 2); // will throw an exception