C#与C++区别

一、基礎:

  1)數組定義:

    C++: int a[] = {1, 1, 1}; 或者 int a[3] = {};

    C#:   int[] a = new int[3];

  2)結構體:

    C++: 引用類型,定義 屬性,不能封裝 protect等

    C#:   值類型,定義 屬性、方法;可以封裝protect等(跟class類似,但不能繼承)

  3)輸入輸出:

    C++: cout、cin、printf()

    C#: Console.WriteLine()、Console.Readline()

  4)多態:

    C++:父类类型的指针指向子类实例,實例化后調用對應函數。

    C#: 子類直接用override關鍵字重寫函數,用實例化子類 直接調用該函數即可。

 

  5)事件:

  

  6)繼承:

   C++:支持多繼承

   C#:  不支持多繼承,單繼承

 

  7)參數引用:

   C++:取地址符 &

   C#:rel(使用前賦初值)、out(使用前無需賦值,函數內輸出前必須賦值)

  

  8)class封裝:

    c++:public、private、protected、

    C#: public、private、protected、 internal(通俗講,就是同一個namespace命名空間裡)

 

  9)類型:

    C++:沒有細分

    C#:

      值類型:char、int、等等

      引用類型:

        -》對象類型object:

        -》動態類型dynamic(後面有時間要深入理解):運行時動態

        -》字符串類型string:

      指針類型:

  

  10)long類型:

    C++:32位

    C#:64位

 

  11)指針使用:

    C++:直接使用,不需要什麼前提條件

    C#:在unsafe(不安全模式)下使用 

      例子:static unsafe void Main(string[] args)

 

  11)static修飾的靜態函數或者靜態屬性:

    C++:需要 符號 :: 調用

    C#:  :: 不起作用, 直接用 符號 . 調用

    拓展:C# 中 符號  :: 和 -> 均不能使用, 用 符號 . 調用

  

  12)定義對象方式:

    C++ :

      -》new方式:  

        Test te = new Test();

      -》直接定義方式:

        Test te;

    C#:

      -》只有new方式,使用跟C++一樣

 

  13)函数参数类型为数组时:

      C++:当参数类型为数组时,函数默认当成指针类型来处理,在函数体里改变数组里的值,函数外面也跟着改变

      C#:  当参数类型为数组时,函数默认当成引用类型来处理,在函数体里改变数组里的值,函数外面也跟着改变

    

  14)函数参数类型为对象时:

      C++:当参数类型为对象时,函数在传参时进行对象的复制,在函数体里改变数组里的值,函数外面不会跟着改变

      C#:  当参数类型为对象时,函数默认当成引用类型来处理,在函数体里改变数组里的值,函数外面也跟着改变

  

  15) 变量初始化

      C++:中当局部变量被定义时,系统不会对其初始化,您必须自行对其初始化。定义全局变量时,系统会自动对其初始化;

      C#:   中无论是局部变量还是全局变量系统都会对其初始化

 

  16)多态:

      C++:

      C#:

        编译时多态:通过重载实现

            -》方法重载

            -》操作符重载

        运行时多态:通过虚拟成员实现

            -》继承:关键字  virtual、override

            -》接口:

            -》抽象

 

二、新增:

  1)委託delegate(類似指針)

     public delegate type callbackFunc(  type name ); type 是指各種類型:int、string等

     創建實例調用: callbackFunc func = new callbackFunc( 需要調用的函數名 ) ;

     

  2)linq集成結構查詢語言:

    -》xml

    -》sql

    -》object:

 

  3)foreach循環遍歷數組

    foreach( int a in array ) {};

 

  4)特性:特性(Attribute)是用于在运行时传递程序中各种元素(比如类、方法、结构、枚举、组件等)的行为信息的声明性标签。

    三種預定義屬性:

      -》AttributeUsage:

        [AttributeUsage(   

          validon, 

          AllowMultiple=allowmultiple, 

            Inherited=inherited

          )]

            参数 validon 规定特性可被放置的语言元素。它是枚举器 AttributeTargets 的值的组合。默认值是 AttributeTargets.All

          参数 allowmultiple(可选的)为该特性的 AllowMultiple 属性(property)提供一个布尔值。如果为 true,则该特性是多用的。默认值是 false(单用的)。

          参数 inherited(可选的)为该特性的 Inherited 属性(property)提供一个布尔值。如果为 true,则该特性可被派生类继承。默认值是 false(不被继承)。

     

      -》Conditional:这个预定义特性标记了一个条件方法,其执行依赖于指定的预处理标识符。它会引起方法调用的条件编译,取决于指定的值,比如 Debug 或 Trace。例如,当调试代码时显示变量的值。

        例子:[Conditional("DEBUG")]

 

 

      -》Obsolete:標記不被使用函數體

        [Obsolete(

           message,

           iserror

          )]

            参数 message,是一个字符串,描述项目为什么过时以及该替代使用什么。

            参数 iserror,是一个布尔值。如果该值为 true,编译器应把该项目的使用当作一个错误。默认值是 false(编译器生成一个警告)。

        例子:

        [Obsolete("Don't use OldMethod, use NewMethod instead", true)]

 

  5)反射reflection:結合特性使用(個人認為特性和反射是不分家的),查看class相關屬性、函數等等。

     子類要繼承:System.Attribute

      

      

 

  6)is 和 as

    is:判斷類型

      例子:

        Object o = new Test();         

          if (o is Test test)

    as:用于两个应用类型之间进行转换,如果转换失败返回null,并不抛出异常

      例子:

        object o = "abc";

        string s = o as string; //执行第一次类型兼容性检查,并返回结果
        if (s != null)
          MessageBox.Show("转换成功!");
        else
          MessageBox.Show("转换失败!");

 

    關於強制類型轉換:

      使用AS运算符,而少使用()运算符的显示转换的理由:

        1、无论是AS和IS运算符,都比世界使用()运算符强制转换更安全。

        2、不会抛出异常,免除使用try···catch进行异常捕获的必要和系统开销,只需要判断是否为null。

        3、使用AS比使用IS性能更好

      

 

  7)lambda表達式

    delegate type func( type name);

    func myfunc = x => x + x;

    myfunc( 5 );

    注意作用域:

    •   被“捕获”的变量在委托的生命周期结束前都不会被垃圾回收;
    •   在Lambda式内部定义的变量对外不可见;
    •         Lambda式无法直接捕获一个具有ref或out描述的参数变量;
    •         Lambda式中的return语句不会导致当前所在的方法
    •    Lambda式中不允许包含会导致跳当前执行范围的goto,break 或 continue语句

 

  8)可空類型(應用場景不多吧,後面抽時間深研究下):

    -》?:单问号用于对 int、double、bool 等无法直接赋值为 null 的数据类型进行 null 的赋值,意思是这个数据类型是 Nullable類型

      int? i

    -》??(Null 合并运算符):

 

  9)裝箱和拆箱:

    -》裝箱:將string類型 打包 轉成 object類型(将值类型的数据打包到引用类型的实例中)

    -》拆箱:通俗理解,就是對象類型 強制轉換成 string等類型(从引用数据中提取值类型)

    注意:裝箱和拆箱操作 很損耗性能

 

  10)動靜態常量:

    -》靜態常量:關鍵字 const,編譯時發生

    -》動態常量:關鍵字 readonly,運行時發生(只能在class中定義)

 

    

 

  

posted @ 2021-10-29 11:06  dcli  阅读(3223)  评论(0)    收藏  举报