C# 使用动态语言运行时(DLR)安全吗?如何在DLR中更改值类型?
正如我最近发现的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
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