C#与C++的区别

C# 学习参考链接:https://www.runoob.com/csharp/csharp-tutorial.html

------------------C#数据类型------------------

一.值类型:bool,int double....
二.引用类型(Reference types):
1)对象类型(object):可以转换成任意值类型,当一个值类型转换为对象类型时,则被称为 装箱;另一方面,当一个对象类型转换为值类型时,则被称为 拆箱。
object obj;
obj = 100; // 这是装箱

2).动态类型(Dynamic types):可以存储任何类型的值在动态数据类型变量中。这些变量的类型检查是在运行时发生的。
dynamic <variable_name> = value;
dynamic d = 20;

三.字符串(String types)类型:
允许您给变量分配任何字符串值。字符串(String)类型是 System.String 类的别名。它是从对象(Object)类型派生的。字符串(String)类型的值可以通过两种形式进行分配:引号和 @引号。
String str = "runoob.com";
string str = @"C:\Windows"; 等价于 string str = "C:\\Windows"; @将所有转义字符当作普通字符对待
字符串中可以任意换行,换行符及缩进空格都计算在字符串长度之内
string str = @"<script type=""text/javascript"">
<!--
-->
</script>";

四.指针类型(Pointer types)
C# 中的指针与 C 或 C++ 中的指针有相同的功能。
char* cptr;
int* iptr;


五.用户自定义类型
class、interface(接口) 或 delegate

 

------------------C#类型转换------------------

显式类型转换 - 显式类型转换,即强制类型转换。显式转换需要强制转换运算符,而且强制转换会造成数据丢失
double d = 5673.74;
int i;

// 强制转换 double 为 int
i = (int)d;

隐式类型转换 - 这些转换是 C# 默认的以安全方式进行的转换, 不会导致数据丢失
如果可能的话
ToBoolean,ToByte,ToChar,ToDateTime,ToDouble,ToInt32,ToString......(类似QT)
int i = 0;
string stri = Convert.ToString(i);


------------------C#变量与C++差不多------------------
接受来自用户的值(控制台)
int num;
num = Convert.ToInt32(Console.ReadLine());
Console.ReadLine() //只接受字符串格式的数据。




------------------C#常量C++差不多------------------
不同之处:
is 判断对象是否为某一类型。
If( Ford is Car) // 检查 Ford 是否是 Car 类的一个对象。
as 强制转换,即使转换失败也不会抛出异常。
Object obj = new StringReader("Hello");
StringReader r = obj as StringReader;


------------------C#运算符,判断,循环与C++差不多------------------
循环不同之处:

C++循环

std::vector<int> vv ;
vv.push_back(2);
vv.push_back(2);

for(auto a : vv)
{
var++;
...
}
int a[] = {3,3,3};
for each (auto var in vv)
{
var++;
...
}

C#循环
string[] s = new string[] { "a,b,c,d,e,f,g" };
foreach (string item in s)
{
Console.WriteLine(item);
}

当然普通for循环大家都一样

 

------------------C#封装(类) 和 C++差不多------------------
C# 支持的访问修饰符如下所示:
public:所有对象都可以访问;
private:对象本身在对象内部可以访问;
protected:只有该类对象及其子类对象可以访问;
internal:同一个程序集的对象可以访问;
protected internal:访问限于当前程序集或派生自包含类的类型。
如果没有指定访问修饰符,则使用类成员的默认访问修饰符,即为 private。//和C++一样
(注意:在同一命名空间)

不同之处:
C#不能
private:
int a;
int b;
只能
private int a;
private int b;


------------------C#方法------------------
貌似只有成员函数,即只能在类里面定义方法
C# 是一种纯面向对象的语言,它要求任何方法必须在类的范围内,因此它没有全局函数和全局变量的概念,技术上也无法做到。
您可以通过把方法声明成静态的来使一个方法与特定的类而不是类的实例关联,但是调用的时候您同样需要给出类的名字,就像Console.WriteLine()方法一样。
例如:
public class Test
{
public static void OutputInfo()
{
Console.WriteLine("Hello from the Test class");
}
end of the class
}
这样,您就可以使用Test.OutputInfo()在另一个命名空间的类里面调用OutputInfo()方法了。 //类似C++的作用域::

参数传递:
1)值参数:当形参的值发生改变时,不会影响实参的值,和C++一样
2)引用参数(ref):当形参的值发生改变时,同时也改变实参的值。
class CTest
{
public void swap(ref int x, ref int y)
{
...
}

static void Main(string[] args)
{
CTest test = new CTest();
int a = 100;
int b = 200;
test.swap(ref a,ref b);
}
}


3)输出参数(out):这种方式可以返回多个值。
return 语句可用于只从函数中返回一个值。但是,可以使用 输出参数 来从函数中返回两个值。输出参数会把方法输出的数据赋给自己,其他方面与引用参数相似。

class CTest
{
public void getvalue(out int x, out int y)
{
int temp = 5;
x = temp;
y = temp + 1;
}

static void Main(string[] args)
{
CTest test = new CTest();
int a,b;
test.getvalue(out a, out b);
}
}

ref和out的区别:
ref有进有出,out只出不进
ref前变量必须初始化,out则可以不初始化
ref用于改变变量,out用于获取变量
相同之处都是传地址


------------------C#可空类型(?与??的使用)------------------
int? i = 3; 等价于 Nullable<int> i = new Nullable<int>(3);
int i; //默认值是0,与C++不同,C++中如果是定义的全局变量或者静态变量,未初始化的话就是0.如果是局部变量,那就是以前残留在堆栈里的随机值。
int? i; //默认值是null

double? num1 = null;
double num2 = num1 ?? 5.34 //num1如果为空则返回5.34


------------------C#数组(Array)与C++有所不同------------------
C#中 int arr[10] 是错误的声明
应该用 double[] balance = new double[10]; //定义时必须指定数组大小
int [] marks = new int[] { 99, 98, 92, 97, 95}; //初始化

C++则是 int* p = new int[10]

Array类是 C# 中所有数组的基类,它是在 System 命名空间中定义。
Array 类提供了各种用于数组的属性和方法
Array 类的常用属性
Length 获取一个 32 位整数,该值表示所有维度的数组中的元素总数。
Array.FunctionName(Array Object...)


------------------C#字符串(String)------------------
字符数组来表示字符串,更常见的是更常见的做法是使用 string 关键字来声明一个字符串变量,string是System.String的别名

String 类的属性
Chars 在当前 String 对象中获取 Char 对象的指定位置。
Length 在当前的 String 对象中获取字符数。

String 类的方法
System.String.FunctionName(...)


------------------C# 中的结构与传统的 C 或 C++ 中的结构不同------------------
C#
struct Books
{
int i;
double b;
}book; //是错误的声明

struct Books
{
int i;
double b;
};
Books book; //正确

C#的结构体与C++不同之处还有:C#结构体不支持继承,不能声明默认的构造函数,不能有protect关键字


------------------C#枚举与C++差不多------------------
C#类的默认访问标识符是 internal,成员的默认访问标识符是 private。
internal(内部):同一个程序集的对象可以访问;//被编译到同一个dll或exe中的程序就是处于同一个程序集中

------------------C#static------------------
C# 类的静态成员变量:与C++一样,所有类的对象共享,不属于该类的任何一个对象,只属于该类
C# 类的静态成员函数:与C++一样,不属于该类的任何一个对象,所有类的对象共享,只属于该类。且只能访问静态变量,静态函数在对象被创建之前就已经存在,如果想调用非静态成员函数,必须先实例化对象,再用对象去调用

 

------------------C#类------------------
与C++差不多,但是不支持多重继承


------------------C#多态性------------------
静态多态性:与C++一样,支持函数重载,运算符重载
动态多态性:动态多态性是通过 抽象类 和 虚方法 实现的
1.C# 允许您使用关键字 abstract 创建抽象类,用于提供接口的部分类的实现。当一个派生类继承自该抽象类时,实现即完成
通过在类定义前面放置关键字 sealed,可以将类声明为密封类。当一个类被声明为 sealed 时,它不能被继承。抽象类不能被声明为 sealed。
2.与C++一样,当有一个定义在类中的函数需要在继承类中实现时,可以使用虚方法。虚方法是使用关键字 virtual 声明的。虚方法可以在不同的继承类中有不同的实现。

------------------C#接口(interface)------------------
定义接口:
interface IMyInterface
{
//接口成员
void MethodToImplement();
...
}

实现接口:
class Ctest : IMyInterface
{
static void Main()
{
Ctest test = new Ctest();
test.MethodToImplement();
}

public void MethodToImplement()
{
....
}
}

继承接口:
interface ImyIf : IMyInterface
{
void fun();
}
接口注意的几点:
接口方法不能用public abstract等修饰。接口内不能有字段变量,构造函数。
接口内可以定义属性(有get和set的方法)。如string color { get ; set ; }这种。
实现接口时,必须和接口的格式一致。
必须实现接口的所有方法。

------------------C#命名空间和C++差不多------------------


------------------C#预处理器指令------------------
与C++不同的是,它不是来定义一个宏,即#define PI 3.14 是错误的,#define PI是可以的,并且C#中,#define必须要在第一行
C#预处理器指令常用的是条件编译
#define PI
#if(PI)
...
#else
...
#endif


------------------C#异常处理------------------
try
{
// 引起异常的语句
}
catch( ExceptionName e1 )
{
// 错误处理代码
}
catch( ExceptionName e2 )
{
// 错误处理代码
}
catch( ExceptionName eN )
{
// 错误处理代码
}
finally
{
// 不管有没有异常都要执行的语句
}
可以列出多个 catch 语句捕获不同类型的异常,以防 try 块在不同的情况下生成多个异常。
C# 中的异常类主要是直接或间接地派生于 System.Exception 类

 

*****************************************************************项目代码中遇到不懂的*****************************************************************
IntPtr 可以用来表示指针或句柄、它是一个平台特定类型,这是一个结构体,如定义一个句柄 IntPtr hwnd;
三、用在什么地方
(1)C#调用WIN32 API时
(2)C#调用C/C++写的DLL时(其实和1相同,只是这个一般是我们在和他人合作开发时经常用到)

posted @ 2019-10-22 16:07  main(0)  阅读(2366)  评论(0编辑  收藏  举报