C 特性杂谈

分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow

也欢迎大家转载本篇文章。分享知识,造福人民,实现我们中华民族伟大复兴!

               

文中充满了各种C#与其他语言的对比及吐槽, 希望介意者勿观… 当然, 鉴于太乱, 我怀疑有没有人能看完.

学习C#

C#也的确不是当年那种微软, Windows独占的语言了, mono项目已经将C#移植到了Mac和Linux上, 甚至还包括iOS和Android. 也就是说, 假如你愿意的话, 你可以使用C#通吃所有平台, 当然, 前提是你能接受巨贵的授权费用. 作为什么事情都喜欢自己搞一套的微软,(因为他都是垄断的) 在C#这件事情上一开始就很开放(因为有JAVA在前), 总算是做对了一件事情.

Hello World

Mono在创建一个名为test的console的工程后, 给了我一个Hello World的代码,

using System;namespace test{  class MainClass  {    public static void Main (string[] args)    {      Console.WriteLine ("Hello World!");    }  }}

第一眼看去, 就知道C#中了JAVA的毒了, 用所谓完全面向对象的方式, 强迫你写一堆臃肿而无用的代码… 我至今也没有明白为什么Main函数最后会变成Main类, 也没有明白这有什么好处… 想起最近看的一篇文章Why Java Sucks and C# Rocks, 说”自从C# 1.0诞生之日起,就只出现Java借鉴C#特性的情况”, 以此来驳斥JAVA一派对C#抄袭的指责. 其实, 光是从Hello World都能看出来C#对JAVA的模仿, 他的言论也的确是避重就轻了, 因为, 连他也无法否认C#诞生前及诞生过程中发生的事情…

值得一提的是, C#对传统的printf进行了改进, {0}形式的占位符不需要表明类型, 只按照数量和位置匹配.

变量与表达式

  1. C#没有像JAVA一样把无符号类型给去掉, 这点我觉得有些不可思议. 在C++新的使用倾向中都已经尽量的去使用有符号的类型了, 除非是进行位运算.
  2. 变量的声明方式和C/C++一致, 为type name;的形式.
  3. 有++自增操作符, 本来很正常的事情, 但是因为最近老是在用Python和Ruby, 看到这个竟然有些亲切.
  4. 枚举可以指定基本类型, 但是本身还是强类型的, 只能强制转换, 不能默认转换.
  5. 有类似C++ 11 auto的类型推理关键字var. 可以极大的简化我们的生活~~~

动态类型

大家都知道类似C/C++, JAVA, C#这种对效率还稍微有些追求的语言都是静态类型语言, 并且靠编译期静态类型检查来排查错误, 而从C++以后, 各语言都以更加’真正的’强类型自豪. 而类似auto,var等自动类型推导的变量只不过是语法糖而已, 所以当我看到C#的确提供了动态类型dynamic, 我还是着实吃了一惊. 这也体现了C#的设计者们比C++, JAVA更加激进的一面. 很多年前, BS就说过(其实Mats也说过类似的), 语言不是一堆特性的堆积, 也不是说堆积的越多就越好. 因为, 很多时候JAVA, C#的拥护者们炫耀着JAVA, C#有着什么样的新特性的时候, 其实并不太感冒. 但是, 这一个, 够让人震撼的. 一个静态语言里面有动态类型会是什么效果? 不禁想让人尝试一番.

public static dynamic Add(dynamic var1, dynamic var2){  return var1 + var2;}

类似上面的Add功能, 本来必须使用模版才能实现, var使用时, 因为是类型推导, 所以必须在初始化时才能使用, 不能用于函数参数, 而真正的动态类型dynamic就可以. 最近使用Python, Ruby比较多, 突然感觉C#有种Python, Ruby上身的感觉.

值类型和引用类型

当我看到Why Java Sucks and C# Rocks(2):基础类型与面向对象一文时, 我还以为C#真的已经是所谓的”完全面向对象”了. 所以当我看到C#入门经典书中写到变量的类型还是分为引用类型和值类型时, 我相当意外.(我先看的那一系列文章, 再看的C#入门经典) 等我看到书中写到封箱和拆箱的时候, 就更加惊讶了… 都是一个对象, 为啥还要封箱和拆箱呢? 当然, 鉴于Objective-C连自动的封箱和拆箱都还没有, 我也不能说这就有多么落后. 
不过, 我用C++的时候就完全没听说过封箱和拆箱的概念, 容器的设计完全可以容纳基础数值, 为啥到了Objective-C, JAVA和C#里反而不行了呢? 因为C++没有统一的基类? 容器设计的时候就压根不是光考虑存储啥Object对象的. 这个倒是让我想起一句话, 你以为你解决了一个问题, 因为你比以前更加优美了, 但是同时带来了另外一个问题, 后来, 你们比较的是后一个问题谁更优美的解决了. 而这个问题本来并不存在…
另外, 当你其实还分值类型和引用类型的时候, 你就已经输给Python, Ruby了, 何必还讨论谁的箱子更好看呢… 要把这个问题上升到理念层次, 我更加就没法认同了.

checked支持的受限强制转换

增加了checked, unchecked(默认)关键字来应付类型转换时的溢出问题. 比如下面的代码:

short source = 257;byte dest = (byte)source;

上面的代码在转换时会发生溢出, 这往往不是我们要的结果, 也往往因此出现莫名而难以调试的bug. 而类似下面的代码会在运行时会抛出System.OverflowException: Number overflow.异常. 这个方案很值得欣赏. 简单有效.

流程控制

  1. 保留了goto.
  2. 有foreach循环, 这个是在C++时代我羡慕的语法糖, 不过现在也不稀奇了.

数组

  1. 从0开始计数. 越界访问抛异常System.IndexOutOfRangeException, 这似乎是C++以后语言的标配了.
  2. 本身带Length表示长度, 标配, 这个在意料之中了.

函数

  1. 看到了引用参数关键字ref, 也算结束了JAVA中痛苦的经历. 在JAVA中都是pass by value, 连一个简单的swap函数都不能直接实现. 还得通过一个构建一个数组来实现, 都不知道怎么想的.
  2. 新增输出参数关键字out, 与ref类似, 有以下区别:
  3. 把为赋值的变量用作ref参数是非法的, 但是可以把未赋值的变量用作out参数.
  4. out参数在函数中使用时, 必须看作时未赋值的.

可选参数

实际上就等于C++里面的参数默认值, 在有默认值时, 在函数最后的参数为可选. 看书中说C#是在C#4后才支持, 为啥呢?

命名参数

命名参数在动态语言里面是很常见的, 并且是个容易理解又很使用的功能. 但是C++并没有支持, 看BS在C++语言的设计与演化中讲到其实当时有过讨论, 只是因为在C++中有所谓的接口与实现分离, 而看以前的代码, 很多接口(头文件)使用的参数名和实现中用的参数名并不一样, 所以这个有用的特性并没有加入C++. 这也是为什么我前面说接口与实现分离实在是太不DRY的一个原因.
当时BS给的例子是用Win32 API创建windows的代码(因为书在同事那里, 记忆不准确请指出), 因为需要的参数实在是太多了. 非常的不方便, 见MSDN:

HWND WINAPI CreateWindow(    _In_opt_  LPCTSTR lpClassName,    _In_opt_  LPCTSTR lpWindowName,    _In_      DWORD dwStyle,    _In_      int x,    _In_      int y,    _In_      int nWidth,    _In_      int nHeight,    _In_opt_  HWND hWndParent,    _In_opt_  HMENU hMenu,    _In_opt_  HINSTANCE hInstance,    _In_opt_  LPVOID lpParam    );

事实上, 在Win32 API里面, 你要完整的创建一个窗口, 还有类似注册窗口类等巨多参数的接口, 而其实在这个API里面, 每次调用时真正需要使用的又并不是所有的参数, 不用说有多不方便了. 可选参数(参数默认值), 只能在参数列表的最后使用, 让这种简化有的时候变成了一个排序游戏, 到底哪个参数才是最不常用的呢?
BS给了在C++里面我们的一种解决方案, 这种方案也是我们在实际中使用的方案, 那就是用struct, 当struct成员变量都有默认值的时候, 我们就只需要给我们真正需要的那个变量赋值即可. 具体的情况就不多说了, 书上都有, 但是在有命名参数后这些都是浮云. 你只需要给你的确需要的参数赋值即可, 也不需要额外的创建类或结构. 比如上例, 有了命名参数后, 我假如只对窗口的宽度感兴趣, 那么如下调用即可:

public static int CreateWindow (  int lpClassName = 0,  int lpWindowName = 0,  int dwStyle = 0,  int x = 0,  int y = 0,  int nWidth = 0,  int nHeight = 0,  int hWndParent = 0,  int hMenu = 0,  int hInstance = 0,  int lpParam = 0){  return 0;}    public static void Main (string[] args){  CreateWindow(nWidth: 640, nHeight: 960);}

还有比这更方便的事情吗? 顺面吐槽一句, Objective-C里面函数调用的方式简直就是为命名参数准备的, 当然竟然完全不支持命名参数, 甚至不支持参数默认值, 崩溃啊…

委托(delegate)

这算是接触到的第一个较新的概念, 多写一点.
delegate是Objective-C里面用的非常多的概念, 有很方便的一面, 但是是在类这个层次上的概念.
C#的委托更加想是Objective-C的SEL/@selector和C++ 11的function, 也就是为了方便函数调用(特别是回调函数)和构建高阶函数而存在的. 这个也是函数不是第一类值(first class)的语言里面需要解决的问题. 函数指针有人说很方便, 但是那个语法实在太逆天了. 当然, 因为这个原因, 其实C#的委托也无法实现直接对<, >, +, -等操作符的控制, 而是需要用类似C++的方法提供辅助函数的方法来完成.

C#的委托:

using System;namespace test{  class MainClass  {    delegate int Actor (int leftParam, int rightParam);    static int Call (Actor fun, int leftParam, int rightParam)    {      return fun(leftParam, rightParam);    }    static int Multiply (int leftParam, int rightParam)    {      return leftParam * rightParam;    }    static int Divide (int leftParam, int rightParam)    {      return leftParam / rightParam;    }    public static void Main (string[] args)    {      Console.WriteLine ("{0}", Call(new Actor(Multiply), 10, 10));      Console.WriteLine ("{0}", Call(new Actor(Divide), 10, 10));      Console.ReadKey();    }  }}

匿名函数(Lambda)

有匿名函数的语言才算是现代语言啊… 我说这句话, C++, JAVA, Objective-C, C#无一中枪, 不管是加入的早晚(其实都是较晚), 上述语言都已经有了使用匿名函数的办法. 对于Python, Ruby来说, 匿名函数就更不是什么新鲜事物了. 比较有意思的是, 作为静态语言的新事物, 上述语言都独立的发展了一套自己的Lambda语法, 而且各有特色, 并且最终的目的似乎都是让你搞不明白. C#的Lambda使用了=>来标记. 因为可以使用类型推导, 所以语法的简洁性上可以做到极致.
参考上面委托的例子, 假如Multiply和Divide我们只是使用一次的话, 还按上面的形式定义就太麻烦了, 匿名函数可以简化代码.

class MainClass{  delegate int Actor (int leftParam, int rightParam);  static int Call (Actor fun, int leftParam, int rightParam)  {    return fun(leftParam, rightParam);  }  public static void Main (string[] args)  {    Console.WriteLine ("{0}", Call((leftParam, rightParam) => {          return leftParam 
1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。
1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值