采用动态C#编程技术
定义新变量时,可以使用 dynamic
关键字,C将让我们对变量成员进行假设。
例如,如果你想声明一个新的 Course
对象,你这样做:
Course newCourse = new Course(); newCourse.Schedule();
当然,这假设你有一个 Course
类定义了我们程序中的其他地方,如下所示:
class Course { public void Schedule() { //Something fancy here } }
但如果你不知道新对象的类是什么呢?
你如何处理这个?
你可以把它声明为 Object
,因为一切都源于 Object
, 正确的?
这是代码: Object newCourse = new Object();
不是那么快,如果你下一行: newCourse.Schedule();
注意Quiggly Line几乎立即出现,并且我们获得了着名的"对象不包含计划..."在设计时错误列表中的错误。
但是,你可以这样做:
dynamic newCourse = SomeFunction(); newCourse.Schedule();
所有此代码都需要具有返回某个值的函数的存根,并且我们很高兴。
如果什么 SomeFunction()
返回一个字符串?
嗯,你得到一个运行时错误。
但它仍然可以编译!
关于现在你可能会想:"这是一件好事吗?
如何!?
!"暂时,你可以责怪COM。
我们看,COM主要由C ++构造,具有变体类型。
在C ++中,我们可以声明一个变量是动态的,如下所示: VARIANT newCourse;
它与动态类型一样,除了尚未发明的CWA。
无论如何,因为在com中使用了很多物体 VARIANT
参数,使用.NET处理Interop真的很难。
因为Microsoft Office大多由COM对象制作,因为它不会很快更改,而且因为Microsoft所有CPRALMMERS都是Office开发人员,因为有一天,BAM,你有动态类型。
例如,说,你的 newCourse
是来自COM类中的方法的变型参数。
要获得值,我们必须声明它是一个对象,如下所示:
CourseMarshaller cm = new CourseMarshaller(); //a COM object int courseId = 4; Object newCourse; cm.MakeCourse(courseId, newCourse); //and now we are back to square one newCourse.Schedule(); //This causes a 'member not found exception'
第6行不会编译,即使计划方法存在,因为我们无法假设 newCourse
将始终作为类对象回来,因为它被声明了一个变体。
你被困了。
但是,使用动态类型,我们可以再次金色,使用此代码:
CourseMarshaller cm = new CourseMarshaller(); //a COM object int courseId = 4; dynamic newCourse; cm.MakeCourse(courseId, newCourse); newCourse.Schedule(); //This now compiles
如果发生了什么 newCourse
回来是没有安排方法的东西?
你得到一个运行时错误。
但这有 try/catch
运行时错误的块。
没有什么能帮助它没有 dynamic
关键词。
是长期视觉基本程序员,甚至更新的VB.NET程序员的读者意识到我们可以动态处理此函数 - 并且始终能够在Visual Basic中实现。
一些开发人员建议使用遗留系统的程序员使用Visual Basic的新代码,这正是为什么。
为了语言奇偶校验,现在CCAN也这样做。
一般来说,这很好,因为许多组织正在在vb中编写遗留代码和c-中的新代码,它可以在战壕中变得非常乱。
此更改使代码基础更纤薄。