为了正常的体验网站,请在浏览器设置里面开启Javascript功能!

我并不是不闻不问![C sharp]

2017-09-05 7页 doc 18KB 9阅读

用户头像

is_648706

暂无简介

举报
我并不是不闻不问![C sharp]我在《我只负责转换![C/C++]》一文从类型转换的角度展示了C/C++对程序员的信任,那么 C#对程序员的信任程度又有多高呢? 我们先来看一段C#代码: // Code #01 public enum Alignment { Left, Center, Right } class Program { static void Main() { Alignment a = (Alignment)(-1); Console.WriteLine(a); a = 0; Console.WriteLine...
我并不是不闻不问![C sharp]
我在《我只负责转换![C/C++]》一文从类型转换的角度展示了C/C++对程序员的信任,那么 C#对程序员的信任程度又有多高呢? 我们先来看一段C#代码: // Code #01 public enum Alignment { Left, Center, Right } class Program { static void Main() { Alignment a = (Alignment)(-1); Console.WriteLine(a); a = 0; Console.WriteLine(a); a = (Alignment)(1); Console.WriteLine(a); a = (Alignment)(2); Console.WriteLine(a); a = (Alignment)(3); Console.WriteLine(a); } } // Output: // // -1 // Left // Center // Right // 3 这段代码能够顺利编译并运行。从输出结果中,我们可以看出C#不会妨碍你进行非预期的枚 举转换。只是你必须对你的行为进行负责,如果你进行了非预期的转换,你将得到非预期的 输出;相反,如果转换是有意义的话,输出也将是有意义的。另外,0是被自动转换成对应 的枚举类型,不需要我们动手。 现在来看另一段C#代码: // Code #02 public enum Alignment : byte { Left, Center, Right } class Program { static void Main() { Alignment a = (Alignment)(-1); Console.WriteLine(a); } } 这次,我们为Alignment指定了底层类型,编译器不再不闻不问了,它拒绝编译并留下这样一句话: error CS0221: Constant value '-1' cannot be converted to a 'Alignment' (use 'unchecked' syntax to override) 跟之前的不同,程序员不应该由于疏忽导致这种溢出,如果你是有意这样做的,必须用 unchecked语法明确告诉编译器: // Code #03 // See Code #02 for Alignment. class Program { static void Main(string[] args) { unchecked { Alignment a = (Alignment)(-1); Console.WriteLine(a); } } } // Output: // // 255 这次编译器就不抱怨了,不过,你也应该认真想一下,这种溢出转换是否真的有必要呢? 那么,这种溢出转换在C++的国度又是怎样一番景象呢?请先看下面的C++代码: // Code #04 #include #include enum _jb_prog_mode : unsigned short { PROGRAM_ONE, PROGRAM_TWO }; int _tmain(int argc, _TCHAR* argv[]) { // In C, the enum keyword is required // to declare a variable of type enumeration. // In C++, the enum keyword can be omitted. // The following expression is legal in C++ only. _jb_prog_mode e_prog_index = (_jb_prog_mode)(-1); std::cout << (unsigned short)e_prog_index << std::endl; return 0; } // Output: // // 65535 这段代码能够正常编译并顺利运行。从输出结果中我们明显看到溢出,但编译器和运行时却 没有半点声响。看来,C++对程序员的信任程度真的去到了巅峰之处。 请注意,ANSI C不允许我们指定枚举的底层类型,所有枚举的底层类型都是int。 接下来我们看看注册表的读取,假定注册表有如下信息: [HKEY_LOCAL_MACHINE\SOFTWARE\Allen] "Name"="Allen Lee" "ID"=dword:00000584 然后我们来看看下面的C#代码: // Code #05 class Program { static void Main(string[] args) { RegistryKey rk = Registry.LocalMachine.OpenSubKey("software\\Allen"); object obj = rk.GetValue("Name"); string nm = (string)obj; // Convert_01 // int nm = (int)obj; // Convert_02 Console.WriteLine(nm); obj = rk.GetValue("ID"); int id = (int)obj; // Convert_03 // string id = (string)obj; // Convert_04 Console.WriteLine(id); } } // Output: // // Allen Lee // 1412 上面这段代码当然可以正常输出正确的结果。如果我们分别把Convert_01和Convert_03替 换为Convert_02和Convert_04呢?编译器不会拒绝你的编译请求,但运行时会毫不犹豫地 抛出InvalidCastException,并指出无法进行指定的类型转换。 那么,C++在面对类似的情况又是如何应付的呢?有兴趣的朋友可以参照《我只负责转换! [C/C++]》一文中给出的代码片断试验一下,你将体会到C++对程序员是何等的信任! 结论?也正如本文的题目—— 我并不是不闻不问! 与C/C++比起来,C#的确没有那么自由,然而,这些限制却为我们带来另一番的味道。究竟 C#的这些限制是对我们的一种帮助还是一种缚束呢?这就见仁见智了。
/
本文档为【我并不是不闻不问![C sharp]】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。 本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。 网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。

历史搜索

    清空历史搜索