C++程序员速通C#:从Hello World到数据类型

C++程序员光速入门C#(一):总览、数据类型、运算符

一.Hello world!

随着.NET的深入人心,作为一个程序员,当然不能在新技术面前停而止步,面对着c++在.net中的失败,虽然有一丝遗憾,但是我们应该认识到,对于c++其实就不应该对其在.Net中的表现有太大的奢望,因为毕竟它并不是一个.Net下的正统语言,.Net应该是c#的舞台,作为一个c++程序员,我们应该庆幸,因为我们学习c#其实是简单的直接的,需要我们接受的新知识其实不多。相对其他语言来说,我们应该可以更加平滑的过渡到c#的开发中.废话不多说,现在就让我们用c++的基础来学习这个渐渐壮大的新语言-----C#。

对于C#的讲解我只讲解和C++有区别的地方,相同的部分我就一带而过,这样的对比学习可以让我们在已有知识的前提下快速掌握C#。

一开始学习语言大部分的教程都会用一个Hello World程序来示范,我们也落入俗套,用Hello World来和C++中做一个比较。

/******************C++程序**********************/
#include <iostream> 
using namespace std; 
int main() 
{ //C++程序 cout<<"Hello World!"<<endl; return 0;
}
/********************C#程序*********************/
using System; 
namespace HelloWorld 
{ class Class1 { //C#程序 static void Main() { Console.WriteLine ("Hello World!"); } } 
} 

乍一眼看上去两者差不多,心中一阵窃喜,可以说C#对语法的定义更加严格一些。

首先对于程序的进入点,最大的区别就是Main函数的开头必须要大写。因为C#是一个完全面向对象的程序语言,所以它的所有代码都必须定义在一个类中,Main函数也不例外。同时因为.net程序在编译运行时都是先转为中间语言,然后中间语言再编译为机器语言,这样的好处有2个。一,如同Java一样,写好的程序可以在不同的系统中运行,而不需要改变程序;二,使用不同的语言写的程序,因为要转化为相同的中间语言,所以在程序开发中可以使用不同的程序语言编写,而相互调用。

当使用不同语言开发或者进行分类开发时,各自开发的程序中会出现相同的变量名,函数名等,所以在写C#程序时,必须把程序包涵在一个名字空间内。C++在多文件编程的时候出现重复的变量名的时候,会比较头疼,C#则没有这个问题,因为所有的类定义都要在一个命名空间里,而变量只能定义在类中,不存在所谓的全局变量。

定义名字空间使用关键字:namespace <空间名>,当一个命名空间中的代码需要使用在另一个名字空间中定义的名称,就必须包括对该命名空间的引用,使用点字符(.) 。

/********************C#程序*********************/
namespace HelloWorld
{class Program{static void Main(string[] args){LevelOne.A a1 = new LevelOne.A();a1.a = 10086;LevelOne.LevelTwo.A a2 = new LevelOne.LevelTwo.A();a2.a = 10086;}}namespace LevelOne{class A{public int a;}namespace LevelTwo{class A{public int a;}}}
}

这里就定义了两个名字相同的变量,我们可以使用LevelOne.A 和 LevelOne.LevelTwo.A 来独立创建两个对象,它们互不干扰。建立了名字空间后,我们可以使用using关键字来简化对它们包含的名称的访问。和C++中使用using namespace std的含义相似。

对于主函数必须要有限定词static 这表明Main函数是静态的,在内存中只能有一个副本。

第一行中的using System.其命名空间是.NET应用程序的根名字空间,包涵了控制台应用程序所需要的所以基本功能。就如同C++中的头文件包涵在std这个名字空间中一样。

Console.WriteLine ("Hello World!"); 

Console是system名字空间中的一个类,其有一个WriteLine方法,它的作用和cout一样,输出一行字符串。

二.数据类型

C#中的数据类型和C++是类似的。

1.浮点类型

浮点类型中添加了一个精度更高的_decimal_类型,对于金融方面的程序开发,此种数据类型用来定义钱币.

2.bool类型

_bool_类型的变量只能赋值为false和true。虽然它们的含义仍然是0和非0,但是在使用中不能再给它们赋值成整数值,在判断语句中 if (bool a==1) 的使用都是错误的。这样的语法让bool类型的意义更加准确。

3.字符类型

_char_类型在C#中是16位的,它不能接收一个整数值,这与C++有所不同。

4.整数类型

整数类新中添加了_byte_(8位无符号整数),sbyte(8位有符号整数),short(16位有符号整数) 类型

_long_变成了真正的64位有符号整数,它可以用在64位机器的编程中。

uintushortulong_顾名思义是没有符号的整数,它类似于C++中的_unsigned int,名字换了一下而已。

_long_类型在C++中的大小是根据编译器位数改变的,32位编译器的时候是4字节,跟_int_没区别。而64位的时候才是8字节,坑爹!

5.字符串类型

string类型是字符串类型,它是引用的类型,它的使用方法和C++中string的使用相似,可以进行+运算(运算符重载)。

string类型有一些方法可以给我们使用,类似C++。例如:ToCharArray() 把字符串放入一个字符数组中等等,可以在MSDN中查找。

6.类型的转换

C#是一个强类型的语言,它的数值类型有一些可以进行隐式转换,其他的必须显式转换,隐式转换的类型只能是长度短的类型转换成长的类型,例如_int_可以转换成_long_,float,double,_decima_l。反之必须显式的转换。

int a=7;  
float b=a;  //隐式转换 
long c=12L;  //和C++一样必须加上后缀L才能将一个常量定义为long型
a=(int)c; //显式转换 

使用上面的显示转换不能用在bool和string类型上,如果希望string或者bool类型和整数类型之间的转化可以使用一个方法:

//Convert.To*****(val) 
//*****:一种数据类型(具体请参看MSDN)  val:可以是这种类型的变量 
int a=123; 
string str=Convert.ToString(a); 
bool m_bool=Convert.ToBoolean(a); 
7.枚举类型

C++和C#的枚举类型,定义相同,使用也相同,只要注意C#中语句最后不需要;结束符。同时定义枚举类型时也不许放在主函数代码段中它只能放在执行代码外面,如下

using System; 
namespace HelloWorld
{class Program{enum Week{ monday=5, tuesday, wednesday,thursday, friday, saturday,sunday }static void Main(string[] args){int a = (int)Week.tuesday;//输出数字6,Right?Console.WriteLine(a);Console.ReadKey();}}
}
8.指针类型

c++中奉为经典的指针类型,在C#中已经取消了,真不知道这个是一个好消息还是坏消息,不过在易用性方面来说因该是一个进步。不过c#中其实在隐藏了一个指针,我们会在后面说到,同时在C#中也可以包含不安全代码,这些代码就是使用了指针的代码。

9.结构类型

C#中的结构类型看上去和C++没有什么区别,定义使用也相似,但还有有很大的区别的,首先就和枚举类型相似, 最后不需要;结束符,同时定义时也不许放在主函数代码段中它只能放在执行代码外面。其二最大的区别就是C#中的结构已经和类相似了,不同的地方在于:C++中的结构中成员变量是公有的,而C#中是私有的,C#中的结构和类的区别唯一就是不能继承(但是可以有接口,这个以后会讲到),但是C#结构是在堆栈中创建的空间,所以最好是对小量的数据进行操作。

/**********************C#程序************************/
using System; 
namespace HelloWorld
{class Program{public struct Student{public int intVar;public double doubVar;}static void Main(string[] args){Student a, b;a.intVar = 1;a.doubVar = 1.1;b = a;a.doubVar = 2.6;Console.WriteLine("{0}  {1}   {2}   {3}", b.doubVar, b.intVar, a.intVar, a.doubVar);Console.WriteLine("{1}  {0}   {3}   {2}", b.doubVar, b.intVar, a.intVar, a.doubVar);}}
}/*********************************
输出结果: 1.1  1  1  2.6 1  1.1  2.6  1 
**********************************//*******************************//C#中的结构类型不能继承!struct A{ }//ERROR!!struct B:A{}class C{ }//YES!class D : C{}
********************************/

C#中的输出定位格式和C语言中的printf类似,但更加简洁,不需要在对不同类型的变量使用不同的占位符,只需对应后面跟着的变量,给出序号就可以了。

10.数组类型

数组的定义和C++有区别,看上去很别扭,定义语法为:

<类型>[] <变量名>  :  int[] num; 

这样就定义了一个int类型的数组,但是切记它可和C++不同,[]里面可不要写内容哦!int[10] num可是错误的。确定数组的大小有两个办法:

一,在定义时指定数据

int[] num = {5,3,7,3}

二,使用关键字new,例:

int[] num = new int[4];

当然两者也可以合起来,例:

int[] num = new int[4]{5,3,7,3};

注意:前面定义了4个数据,后面花括号里面就必须有4个数据,不然就是错误的。

//错误!!
//int [] num = new int[4]{4,3}; 

并且,对多维数组的定义和C++是不同的。C++中定义为

int num[3][4] = {1,2,3,4,5,3,2,3,4,2,3,4}; 

C#中定义为

int[,] num = new int[3,4]{{1,2,3,4},{5,3,2,3},{4,2,3,4}};

注意,和C++不同C#不能在数据列表中不分类,也就是说不使用{}把一组括起来是错误的,而在C++中是正确的。

//ERROR to C#!!!
//int[,] num=new int[3,4]{1,2,3,4,5,3,2,3,4,2,3,4};

对数据的使用和赋值也相应的变为

//C#的数组成员使用和赋值
num[2,1]=3; 
//C++的数组成员使用和赋值
num[2][1]=3;

C#在数组中最富革命性的改变,应该就是是添加了锯齿形数组(或者说交错数组)。例如它可以添加一组{{1,2,3,4},{2,3},{2,3,1}}长度不一样的数据,,在C++中只能创建一个三行四列的数组,在C#中它能够产生这样一个锯齿形数组,第一组中有4个数据,第二组中有2个数组,第三组中有3个,这样可以不浪费内存。

灵魂绘图

锯齿数组的定义和前面的定义也有区别,它更像是一个数组中包含了一个数组

int[][] num = new int[3][]; 
num[0] = new int[4]{1,2,3,4}; 
num[1] = new int[2]{2,3}; 
num[2] = new int[3]{2,3,1}; 

下面是上面的定义的一种简洁写法:

int[][] sum = {new int[]{1,2,3,4}, new int[]{2,3}, new int[]{2,3,1}}; 

三.变量

变量的使用和作用域和C++类似,没有什么特别需要注意的。但是首先我们应该看到,C#是一门完全面向对象的语言,也就是说定义的变量都变成了类的私有成员(定义时如果没加访问修饰符的话)。如果要在别的类中使用变量就需要在定义语句前加上访问修饰符public。

在C#中必须给每个变量添加访问修饰符

public int a; 
public int b; 

C#中的访问修饰符还有一些,如下:

internal:变量只能在当前程序中使用.

new:在用作修饰符时,new 关键字可以显式隐藏从基类继承的成员。

private:私有的,和C++中含义一样

protected:保护类型,和C++中含义一样

static:静态的,和C++中含义一样

readonly: 只读,在变量初始化(构造函数)以后就不许改变.

protected internal:双重限定,但只有这一个组合

访问修饰符_new_的用法如下

public class Program : BaseClass
{new public class Test//2、new修饰符 显式隐藏从基类继承的成员{public int x = 2;public int y = 20;public int z = 40;}static void Main(string[] args){var c1 = new Test();//1、new操作符 创建对象和调用构造函数var c2 = new BaseClass.Test();Console.WriteLine(c1.x);//2Console.WriteLine(c2.y);//10Console.ReadKey();}
}public class BaseClass
{public class Test{public int x = 0;public int y = 10;}
}

四.常量

C#有两种常量,一种是_const_修饰的,一种是_readonly_修饰的。

_const_和_readonly_的区别是:

1._readonly_为运行时常量,程序运行时进行赋值,赋值完成后便无法更改,因此也有人称其为只读变量。_const_为编译时常量,程序编译时将对常量值进行解析,并将所有常量引用替换为相应值。

2._readonly_常量只能声明为类字段(即C++中的成员变量),支持实例类型或静态类型,可以在声明的同时初始化或者在构造函数中进行初始化,初始化完成后便无法更改。_const_常量除了可以声明为类字段之外,还可以声明为方法中的局部常量,默认为静态类型(无需用_static_修饰,否则将导致编译错误),但必须在声明的同时完成初始化。

static void Main(string[] args)
{//OKconst int a = 10;//ERROR!!//readonly int b = 10;
}

3.由于_const_常量在编译时将被替换为字面量,使得其取值类型受到了一定限制。_const_常量只能被赋予数字(整数、浮点数)、字符串以及枚举类型。而_readonly_则可以修饰类对象。

//ERROR!!
//public const DateTime D = DateTime.MinValue; 
//OK
public readonly DateTime D = DateTime.MinValue; 

五.运算符

C#中的运算符,优先级和C++一样,但是需要注意下面的四个运算符

*  ,  ->  ,  &   ,sizeof 

上面的四个运算符在C#的不安全代码中可以使用,但在一般的C#代码中使用是错误的,C#取消了指针,当然和指针有关的操作符都不能用了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/news/922411.shtml
繁体地址,请注明出处:http://hk.pswp.cn/news/922411.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux相关概念和易错知识点(44)(IP地址、子网和公网、NAPT、代理)

目录1.IP地址&#xff08;1&#xff09;局域网和公网①局域网a.网关地址b.局域网通信②运营商子网③公网&#xff08;2&#xff09;NAPT①NAPT过程②理解NAPT③理解源IP和目的IPa.目的IPb.源IP③最长前缀匹配④NAT技术缺陷2.代理服务&#xff08;1&#xff09;正向代理&#xf…

工业智能终端赋能自动化生产线建设数字化管理

在当今数字化浪潮的推动下&#xff0c;自动化生产线正逐渐成为各行各业提升效率和降低成本的重要选择。随着智能制造的深入发展&#xff0c;工业智能终端的引入不仅为生产线带来了技术革新&#xff0c;也赋予了数字化管理新的动力。一、工业智能终端&#xff1a;一体化设计&…

【Vue2手录06】计算属性Computed

一、表单元素的v-model绑定&#xff08;核心场景&#xff09; v-model 是Vue实现“表单元素与数据双向同步”的语法糖&#xff0c;不同表单元素的绑定规则存在差异&#xff0c;需根据元素类型选择正确的绑定方式。 1.1 四大表单元素的绑定规则对比表单元素类型绑定数据类型核心…

FPGA入门-数码管静态显示

19. 数码管的静态显示 在许多项目设计中&#xff0c;我们通常需要一些显示设备来显示我们需要的信息&#xff0c;可以选择的显示设备有很多&#xff0c;而数码管是使用最多&#xff0c;最简单的显示设备之一。数码管是一种半导体发光器件&#xff0c;具有响应时间短、体积小、…

深入理解大语言模型(5)-关于token

到目前为止对 LLM 的描述中&#xff0c;我们将其描述为一次预测一个单词&#xff0c;但实际上还有一个更重要的技术细 节。即 LLM 实际上并不是重复预测下一个单词&#xff0c;而是重复预测下一个 token 。对于一个句子&#xff0c;语言模型会 先使用分词器将其拆分为一个个 to…

视觉智能的「破壁者」——Transformer如何重塑计算机视觉范式?三大CV算法论文介绍 ViTMAESwin Transformer

当自然语言处理领域因Transformer而焕发新生时&#xff0c;计算机视觉却长期困于卷积神经网络的架构桎梏。直到ViT&#xff08;Vision Transformer&#xff09;的横空出世&#xff0c;才真正打破了视觉与语言之间的壁垒。它不仅是技术的革新&#xff0c;更是范式革命的开始&…

Java 并发容器源码解析:ConcurrentSkipListSet 行级深度剖析

Java 并发容器源码解析&#xff1a;ConcurrentSkipListSet 行级深度剖析 本文将深入解析 Java 并发容器 ConcurrentSkipListSet 的核心源码&#xff0c;结合流程图、代码注释、设计思想、优缺点分析、业务场景、调试与优化、集成方案、高阶应用等&#xff0c;帮助你系统掌握这款…

答题卡自动识别案例

目录 1.答题卡自动批阅整体实现思路 2.关键技术步骤与原理 答题卡区域提取 ①轮廓检测并排序 ②执行透视变换 ③找到每一个圆圈轮廓 ④先对所有圆圈轮廓从上到下排序 ⑤再通过循环每次只提取出五个轮廓再进行从左到右的排序 3.完整代码 1.答题卡自动批阅整体实现思路 …

C#实现通过POST实现读取数据

C# POST请求与MySQL数据存储实现下面是一个完整的C#解决方案&#xff0c;用于发送POST请求、接收响应数据&#xff0c;并将数据保存到MySQL数据库中。完整代码实现 using System; using System.Net.Http; using System.Text; using System.Threading.Tasks; using Newtonsoft.J…

Java 字符编码问题,怎么优雅地解决?

网罗开发&#xff08;小红书、快手、视频号同名&#xff09;大家好&#xff0c;我是 展菲&#xff0c;目前在上市企业从事人工智能项目研发管理工作&#xff0c;平时热衷于分享各种编程领域的软硬技能知识以及前沿技术&#xff0c;包括iOS、前端、Harmony OS、Java、Python等方…

STL之string类(C++)

1.string类核心定位std::string 本质是对 “字符序列” 的封装&#xff0c;内部通过动态数组存储字符&#xff0c;并自动管理内存&#xff08;分配、扩容、释放&#xff09;&#xff0c;对外提供了简洁的接口用于字符串的创建、修改、拼接、查找等操作。1.1 使用前提头文件包含…

[Maven 基础课程]第一个 Maven 项目

idea 新建一个项目&#xff1a; 来到 New Project 页面&#xff1a; 这里我们有两种方式创建 maven 项目&#xff0c;一种是自定义创建&#xff0c;另一种是使用 maven 模版项目创建。 自定义创建 maven 项目 基本配置 Name: first_maven_project 项目名称&#xff0c;设为 …

uni小程序中使用Echarts图表

前言 今天鸡米花给大家带来的是在uni里面使用echarts&#xff0c;能够完美支持和PC端一样的效果&#xff0c;我这边的工程是uni转为微信小程序&#xff0c;用的是vue3vite来写的&#xff0c;然后实现了竖屏和横屏的展示方式&#xff0c;好了献上效果图。 效果图 一、引入插件 这…

从FOTA测试到汽车电子安全体系的启蒙之旅

我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 做到欲望极简,了解自己的真实欲望,不受外在潮流的影响,不盲从,不跟风。把自己的精力全部用在自己。一是去掉多余,凡事找规律,基础是诚信;二是…

stm32中 中断和事件的区别

一、核心概念比喻想象一下工厂里的一个报警系统&#xff1a;​中断 (Interrupt)​​&#xff1a;就像火警警报器响了。它的目的是通知管理员&#xff08;CPU&#xff09;​​&#xff1a;“着火了&#xff01;”。管理员听到后&#xff0c;会停下手中的工作&#xff08;保存现场…

深入理解MySQL主从架构中的Seconds_Behind_Master指标

问题&#xff1a;主从延迟与写后读不一致 在典型的 MySQL 主从架构下&#xff0c;所有写操作都会直接进入主库&#xff0c;而读操作大多分流到从库&#xff0c;从而实现读写分离&#xff0c;缓解主库压力。 然而 MySQL 的复制机制是异步的&#xff1a;主库先写入 binlog&#…

MySQL安装(linux版本)

MySQL安装&#xff08;linux版本&#xff09; 课程地址 08. 进阶-MySQL安装(linux版本)_哔哩哔哩_bilibili 安装过程中所有需要的程序都放在网盘里了 通过网盘分享的文件&#xff1a;虚拟机 链接: https://pan.baidu.com/s/1eLMD2iq1uEujNN7mWs2dIg?pwdckmh 提取码: ckmh …

OpenCV 图像双三次BSpline插值

文章目录 一、简介 二、实现代码 三、实现效果 参考资料 一、简介 之前我们介绍过BSpline曲线,一条B样条曲线可以被定义成 n + 1 n+1 n+1个控制点的集合 { Q i } i = 0 n {\{Q_i\}}^{n}_{i=0}

Prometheus+Grafana构建企业级监控方案

1.prometheus工作原理&#xff1a; Prometheus将指标收集并存储为时间序列数据库&#xff08;时序数据库&#xff09;&#xff0c;即指标信息与记录它的时间戳一起存储&#xff0c;以及称为标签的可选键值对。 特性&#xff1a; 具有由指标名称和键/值对识别的时间序列数据的…

第23课:行业解决方案设计

第23课:行业解决方案设计 课程目标 掌握金融、医疗、教育等行业应用 学习领域特定Agent设计 了解行业标准集成 实践设计行业解决方案 课程内容 23.1 金融行业解决方案 金融Agent系统 class FinancialAgentSystem {constructor() {this.agents =