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中定義)

浙公网安备 33010602011771号