关于FlagsAttribute
2016-03-18 17:06
148 查看
最近在看C#本质论,有介绍FlagsAttribute的特性,看了下源码,发现只是一个简单的特性class和一个构造函数。
调试了一下.NET的源码,发现在console.writeline(***); ***是带有flags特性的Enum, 实际上,这个时候, 调用的是writeline(Object value)这个函数,
然后在函数中,有调用 f.tostring()
public virtual void WriteLine(Object value) { if (value==null) { WriteLine(); } else { // Call WriteLine(value.ToString), not Write(Object), WriteLine(). // This makes calls to WriteLine(Object) atomic. IFormattable f = value as IFormattable; if (f != null) WriteLine(f.ToString(null, FormatProvider)); else WriteLine(value.ToString()); } } 继续跟踪,是调用那个了Enum.tostring() 重写的方法,在这里,判断了如果有flags特性的话,会反射***,获取字段名,然后输入,而不是直接输出 int了。
http://referencesource.microsoft.com/ 上有如何调试.NET源码,比较方便,不用先下载源码,设置好 调试--符号位置,然后可以先下载调试符号,然后慢慢下载源码跟踪就可以了。
之前也下载了 .net4.6的源码,但是编译有问题,如果用这种方式调试的话,实际上就跟普通的项目一样了,引用dll,然后跟进去就可以了。
调试了一下.NET的源码,发现在console.writeline(***); ***是带有flags特性的Enum, 实际上,这个时候, 调用的是writeline(Object value)这个函数,
然后在函数中,有调用 f.tostring()
public virtual void WriteLine(Object value) { if (value==null) { WriteLine(); } else { // Call WriteLine(value.ToString), not Write(Object), WriteLine(). // This makes calls to WriteLine(Object) atomic. IFormattable f = value as IFormattable; if (f != null) WriteLine(f.ToString(null, FormatProvider)); else WriteLine(value.ToString()); } } 继续跟踪,是调用那个了Enum.tostring() 重写的方法,在这里,判断了如果有flags特性的话,会反射***,获取字段名,然后输入,而不是直接输出 int了。
http://referencesource.microsoft.com/ 上有如何调试.NET源码,比较方便,不用先下载源码,设置好 调试--符号位置,然后可以先下载调试符号,然后慢慢下载源码跟踪就可以了。
之前也下载了 .net4.6的源码,但是编译有问题,如果用这种方式调试的话,实际上就跟普通的项目一样了,引用dll,然后跟进去就可以了。
相关文章推荐
- 面试感悟
- Java虚拟机类加载机制+案例分析
- 公式编辑器使用帮助
- 九度题目1207质因数的个数
- 出现( linker command failed with exit code 1)错误总结
- MySQL多实例介绍及安装
- 10011---Spring Security(01)——初体验
- oracle 日期格式
- 面向对象的js程序设计
- centos 6.x 开机自启动ejabberd
- 设计模式之装饰者模式
- js api 实现钉钉免登
- Leetcode:28. Implement strStr()(JAVA)
- Android —— 依赖注入LayoutCreator
- 看看精彩的世界,使用网络技术
- Java 后台创建word 文档
- PHP学习(一)----变量及字符串
- va_start和va_end使用详解
- 实验StringBuilder类实现字符反转
- JS Date函数处理