codecamp

C# 动态绑定

C# 动态绑定

动态绑定会将类型,成员和操作的解析过程从编译时延迟到运行时。

使用上下文关键字 dynamic 声明动态类型:


dynamic d = GetSomeObject();
d.OneMethod();

动态类型期望 d 的运行时类型具有OneMethod 方法。

由于d是动态的,编译器会将OneMethod绑定到d,直到运行时。

动态转化

动态类型具有来自所有其他类型的隐式转换:


int i = 7;
dynamic d = i;
long j = d; // No cast required (implicit conversion)

要使转换成功,动态对象的运行时类型必须可隐式转换为目标静态类型。

以下示例会抛出RuntimeBinderException,因为int不能隐式转换为short:


int i = 7;
dynamic d = i;
short j = d; // throws RuntimeBinderException

var vs dynamic

var 使编译器找出类型。

dynamic
使运行时确定类型。

为了显示:


dynamic x = "hello"; // Static type is dynamic, runtime type is string
var y = "hello";     // Static type is string, runtime type is string

int i = x; // Runtime error
int j = y; // Compile-time error

var 声明的变量的静态类型可以是动态的:


dynamic x = "hello";
var y = x; // Static type of y is dynamic
int z = y; // Runtime error

动态表达式

字段,属性,方法,事件,构造函数,索引器,运算符和转换都可以动态调用。

涉及动态操作数的表达式通常本身是动态的:


dynamic x = 2;
var y = x * 3; // Static type of y is dynamic

将动态表达式转换为静态类型会生成静态表达式:


dynamic x = 2;
var y = (int)x; // Static type of y is int

构造函数调用总是产生静态表达式。

在此示例中,x静态类型为StringBuilder:


dynamic capacity = 1;
var x = new System.Text.StringBuilder (capacity);
C# 匿名类型
C# 属性
温馨提示
下载编程狮App,免费阅读超1000+编程语言教程
取消
确定
目录

关闭

MIP.setData({ 'pageTheme' : getCookie('pageTheme') || {'day':true, 'night':false}, 'pageFontSize' : getCookie('pageFontSize') || 20 }); MIP.watch('pageTheme', function(newValue){ setCookie('pageTheme', JSON.stringify(newValue)) }); MIP.watch('pageFontSize', function(newValue){ setCookie('pageFontSize', newValue) }); function setCookie(name, value){ var days = 1; var exp = new Date(); exp.setTime(exp.getTime() + days*24*60*60*1000); document.cookie = name + '=' + value + ';expires=' + exp.toUTCString(); } function getCookie(name){ var reg = new RegExp('(^| )' + name + '=([^;]*)(;|$)'); return document.cookie.match(reg) ? JSON.parse(document.cookie.match(reg)[2]) : null; }