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相同,只是这个一般是我们在和他人合作开发时经常用到)
C#与C++的区别的更多相关文章
- c#与java的区别
经常有人问这种问题,用了些时间java之后,发现这俩玩意除了一小部分壳子长的还有能稍微凑合上,基本上没什么相似之处,可以说也就是马甲层面上的相似吧,还是比较短的马甲... 一般C#多用于业务系统的开发 ...
- jquery和Js的区别和基础操作
jqery的语法和js的语法一样,算是把js升级了一下,这两种语法可以一起使用,只不过是用jqery更加方便 一个页面想要使用jqery的话,先要引入一下jqery包,jqery包从网上下一个就可以, ...
- 【原】nodejs全局安装和本地安装的区别
来微信支付有2年多了,从2年前的互联网模式转变为O2O模式,主要的场景是跟线下的商户去打交道,不像以往的互联网模式,有产品经理提需求,我们帮忙去解决问题. 转型后是这样的,团队成员更多需要去寻找业务的 ...
- 探究@property申明对象属性时copy与strong的区别
一.问题来源 一直没有搞清楚NSString.NSArray.NSDictionary--属性描述关键字copy和strong的区别,看别人的项目中属性定义有的用copy,有的用strong.自己在开 ...
- X86和X86_64和X64有什么区别?
x86是指intel的开发的一种32位指令集,从386开始时代开始的,一直沿用至今,是一种cisc指令集,所有intel早期的cpu,amd早期的cpu都支持这种指令集,ntel官方文档里面称为&qu ...
- Java中Comparable与Comparator的区别
相同 Comparable和Comparator都是用来实现对象的比较.排序 要想对象比较.排序,都需要实现Comparable或Comparator接口 Comparable和Comparator都 ...
- MySQL中interactive_timeout和wait_timeout的区别
在用mysql客户端对数据库进行操作时,打开终端窗口,如果一段时间没有操作,再次操作时,常常会报如下错误: ERROR (HY000): Lost connection to MySQL server ...
- 设置line-height:1.5和line-height:150%或者line-height:150px的区别
直接正题: 看一下line-height可能的值: 其实可以分为两类: (1)不带单位的(如line-height:1.5),这种是推荐使用的: (2)带单位的(如line-heigth:30px/1 ...
- C#中Length和Count的区别(个人观点)
这篇文章将会很短...短到比你的JJ还短,当然开玩笑了.网上有说过Length和count的区别,都是很含糊的,我没有发现有 文章说得比较透彻的,所以,虽然这篇文章很短,我还是希望能留在首页,听听大家 ...
- select、poll、epoll之间的区别总结
select.poll.epoll之间的区别总结 05/05. 2014 select,poll,epoll都是IO多路复用的机制.I/O多路复用就通过一种机制,可以监视多个描述符,一旦某个描述符就绪 ...
随机推荐
- 【luogu2668斗地主】模拟
题目描述: 输入格式: 输出格式: 输入样例: 1: 1 8 7 4 8 4 9 1 10 4 11 1 5 1 1 4 1 1 2: 1 17 12 3 4 3 2 3 5 4 10 2 3 3 1 ...
- 网络层中的 IP 协议
IP协议 IP(IPv4.IPv6)相当于 OSI 参考模型中的第3层——网络层.网络层的主要作用是“实现终端节点之间的通信”.这种终端节点之间的通信也叫“点对点通信”. 网络的下一层——数据链路层的 ...
- oracle函数mysql替代方案
=====1.日期相关===//获取当前日期在本周的周一select subdate(now(),date_format(now(),'%w')-1);//获取当前日期在本周的周日 select su ...
- DIV盒子模型介绍 div用法
- Django连接MySQL出错
错误一:No module named 'MySQLdb' 原因:python3连接MySQL不能再使用mysqldb,取而代之的是pymysql. 解决方法:在python的MySQL包中,即路径: ...
- linux下批量转换文件
一.背景 今天遇到windows下文件放置到ubuntu下后,使用vi打开文件,发现每一行结尾总是显示出^M,因此以下是批量转换成linux下格式的方法 二.批量转换成unix下的格式 find . ...
- webstrom配置node语法提示
一.mac下打开设置 二.输入node,找到node.js npm,勾选上对勾就好了. 第三.按住ctr,点击右键可以点进去就可以了.
- URL编码和解码
1. 为什么需要编码 当数据不利于处理.存储的时候,就需要对它们进行编码.如对字符进行编码是因为自然语言中的字符不利于计算机处理和存储.对图片信息.视频信息.声音信息进行压缩.优化,将其“格式化”,是 ...
- kubernetes发布tomcat服务,通过deployment,service布署(转)
1.制作tomcat镜像 参考docker tomcat镜像制作 此处直接拉取 查看已有可镜像 先设置docker阿里源,即添加 "registry-mirrors": [&quo ...
- linux简单命令8---软件包安装
1:使用yum安装,它不能包查询和包校验.它安装的是RPM格式文件.没有yum文件 ---------------------------------------------------------- ...