C#语言基础
这是引我入门的一个博客主(我很喜欢)的文章 这是他的博客:http://www.cnblogs.com/tonney/archive/2011/03/16/1986456.html
一、 C#与.Net的关系
C#是一种相当新的编程语言。C#的重要性体现在以下两个方法:
1)、它是专门为Microsoft的.net FrameWork一起使用而设计的 (.net FrameWork是一个功能非常丰富的平台,可开发,部署和执行分布式应用程序)
2)、它是一种基于现代面向对象设计方法的语言,它在设计它的时候,Microsoft还吸取了其他所有类似语言的经验,这些语言是近20年面向对象规则得到广泛应用后才开发出来的。
有一个很重要的问题要弄明白:C#就其本身而言只是一种语言,它本身不是.net本身的一部分。.net支持的一些特性,C#并不支持,而C#语言的另一些特性,.net却不支(如运算符重载).因为C#和.Net一起使用,所以如果要使用C#高效的开发应用程序,理解Framework是非常重要.这里我就不再详谈了。
二、了解C#的一些基础
1、 c#在向控制台输出语句
语言 |
输入语句 |
|
|
输出不换行 |
输出换行 |
C# |
Console.Write() |
Console.WriteLine() |
2、转义换行
语言 |
转义符 |
|
|
换行 |
空8个空格 |
|
\n |
\t |
c# |
Console.Write(“我\n你”); |
Console.Write(“成绩:\t”); |
3、c#接收用户在控制台输入的资料
语言 |
等待用户输入 |
|
c# |
Console.WriteLine(“请输入密码:”); string pwd=Console.ReadLine(); Console.WriteLine(“请输入身高:”); double height=double.Parse(Console.ReadLine()); |
Console.ReadLine(); 接收字符串,如果需要数字类型,我们就需要利用 Convert.ToXX(Console.ReadLine());//这里的xx可以为int、double等 对于小数、整数必须转换: int.Parse(字符串) –把字符串转换为整数 注:这里我们不能使用(int)xx这种隐式转换。string不能直接转为数字类型
|
4、关于 XX.Parse()用法需要注意
XX.Parse(); 这里的XX可以是 int、double、bool等
它的用途是:把字符串转换为其它类型
下面的语法都是错误的:
int.Parse(“我和你”); 不行,因为“我和你”不是有效的数字
int.Parse(123); 不行,必须是字符串
int.Parse(“123.45”); 不行,因为”123.456”是小数,所以不能转换为整数
5、认识C#的三种注释
快捷键(vs2012)
Ctrl+K+C 选择多行代码注释
Ctrl+K+U 取消多行代码注释
Ctrl+E+C 选择多行代码注释
Ctrl+E+U 取消多行代码注释
语言 |
注释 |
||
|
单行注释 |
多行注释 |
文档注释 |
c# |
//… |
/* |
/// ///… /// |
在实际的开发过程中,这三种注释都要用到,因为它便于让其他开发人员了解你做此程序的目的或者某一段代码的用法及定义这个变量是干什么用的。
注: 我也会在我的随后的随笔中总结一篇vs2012的快捷键的操作
6、Console.WriteLine()的语法格式(3种)
1)、 Console.WriteLine(); //输出一行
2)、Console.WriteLine(要输出的值);
3)、Console.WriteLine(“格式化字符串”,变量列表);
说明:{0}:占位符
依次使用{0}、{1}、{2}…与变量列表中的变量对应
下面是一个使用”+”拼接 和 使用格式化字符串输出结果的对比:
语言 |
|
格式化字符串 |
c# |
int a=2; |
int a=2; 结果:2+3=5 |
可能刚开始,有些初学者还不太习惯使用占位符的形式,但是以后你以后你就会慢慢发现,格式化字符串的强大功能之处。现不在这里多加描述。
把a的值赋值给占位符{0},把b的值赋值给占位符{1},以此类推
可能刚开始,有些初学者还不太习惯使用占位符的形式,但是以后你以后你就会慢慢发现,格式化字符串的强大功能之处。现不在这里多加描述。
案例:使用格式化字符串来拼接一句话:
__心__意,__心__意,__ 羊__泰
Console.WriteLine(“{0}心{0}意,{1}心{2}意,{1}羊{3}泰”,
”一”, ”三”, ”二”, ”开” )
那么请您思考一下占位符{0}、{1}、{2}、{3}分别代表什么?
最后,请大家打开VS工具,试着用”+”拼接符 和 使用 格式化字符串来进行制作以下小程序
题目: 输入姓名和年龄,输出结果
在第一章我们了解了C#的输入、输出语句后,我这一节主要是介绍C#的基础知识,本节的内容也是后续章节的基础,好的开端等于成功的一半。在你阅读完本章后,你就有足够的C#知识编写简单的程序了。但还不能使用继承或其它面向对象的特征。
本章主要针对以下几个部份来进行讲解:
1、电脑是由什么来存储所使用的数据?
2、基本数据类型有哪些?
3、如何声明变量和赋值?
4、变量和常量的区别?
5、不同数据类型之间是如何转换的?
下面,我们现一个一个的来了解这些问题。
一、电脑是由什么来存储所使用的数据?
这个问题用一句话比较笼统的概括,那就是:电脑使用内存来记忆计算时所使用的数据。
在现实生活中的数据各种各样,整数、小数、字符串、字符等等,它们都类型是不一样的,所以你要想在计算机中使用这些类型,就必须在内存中为它申请一块合适的空间。
那有哪些数据类型是C#能使用的呢?我们一起来看一看.
二、基础数据类型有哪些
首先要了解一点:C#认可的基础数据类型并没有内置于C#语言中,而是内置于.net Framework中。
如,在c#中声明一个int类型的数据时,声明的实际上是.net结构System.Int32的一个实例。这听起来似乎很深奥,但其意义深远:这表示在语法上,可以把所有的基础数据类型看作是支持某些方法的类。
类型实际上仍存储为基本类型。基本类型在概念上用.Net结构表示,所以肯定没有性能损失。
下面大家一起来了解一下C#中定义的内置类型,我们将列出每个类型,以及它们的定义和对应的.net类型(CTS类型)的名称。
c#有15个预定义类型,其中13个是值类型,两个是引用类型(string 和 object)
1、整型
2、浮点类型
float数据类型用于较小的浮点数,因为它要求的精度较低。
double数据类型比float数据类型大,提供的精度也大一倍(15位)。
如果在代码中没有对某个非整数值(如12.3)硬编码,则编译器一般假定该变量是double。
如果想指定该值为float,可以在其后加上字符F(或f),如:
float f = 12.3F;
3、decimal类型
decimal类型专门用于进行财务计算,使用decimal类型提供的28位的方式取决于用户。
要把数字指定为decimal类型,可以在数字的后面加上字符M或(m),如:
decimal d=12.30M;
4、bool(布尔)类型
5、char字符类型
char类型的字变量是用单引号括起来的。 如\’A\’
如果把字符把在”A”(双引号)内,编译器会把它看作是字符串,从而产生错误。
6、引用类型(Object类型和字符串类型)
三、如何声明变量和赋值?
1、变量的定义:是指在程序的运行过程中随时可以发生变化的量
2、上面我们提到,变量在运行时当中是存在内存当中的,它是一个临时的存放场所。
那么在内存当中,可以存放如数字、字符串、日期等等各种类型的数据。
大家可以看一看这张图,它就把表示内存当中的一个状态。
简单的来说,变量就是表示内存当中的一块存储区域。
它会对应一个唯一的内存地址,但是我们在使用程序当时候,内存地址不好理解也不好记忆。 那么怎么办呢?
在日常生活当中我们都有一个名字,如”张三“、”李四“等,这些名字就是为了便于记忆。 那么同样,在程序当中,为了区别多个变量,那就需要为每个变量赋值一个简短,便于记忆的名字, 这就是变量名。 |
3、 C#中的变量的命名是是有规则的:
1)、由字母、数字或下划线”_”组成
2)、必须由字母或下划线”_”开头,不能以数字开头
3)、不能是c#中的关键字 如:int、string、bool、Main、class等
4)、区分大小写 如:小写的a 和 大写的A 是两个变量
4、做为一个比较好的学习者,就必须遵守一些变量命名规范:
1)、变量的名字要有意义,尽量用对应的英语命名,具有“见名知意“的作用。
如:姓名 变量取名为 name 或者 用拼单 xingMing,避免用a,b,c来进行命名。
2)、避免使用单个字符作为变量名( 除在循环里面定的变量)
3)、当使用多个单词组成变量名时,应该使用骆驼(Camel)命名法
骆驼(Camel)命名法:第一个单词的首字母小写,其它单词的首字母大写,如:myName,myAge
上一章我们了解了C#的一些数据基本类型、如何定义使用变量及类型之间的相互转换。可能大家会发现程序只能按照我们的要求从上向下这样顺序一条一条的执行。
那么程序能按照我们的要求,当某个条件成立的时候才执行呢?答案是肯定的,因为程序中有这样的流程语句。
那么我们本章讲像大家讲解一下C#的运算符及条件控制语句。
本章主要针对以下几个部份来进行讲解:
1、算述运算符
2、关系运算符
3、逻辑运算符
4、条件语句
5、分支语句
一、算述运算符
程序中所运用的算术运算符跟我们平常日常生活中接触的算术也一样。主要分为:
加、减、乘、除、 模(求余数)
+、 -、 *、 /、 %
两个数的运算如下:
int a=5,b=6;
int c=a+b;
//程序首先定义两个整型变量a和b,并对它们赋初始值,a为5,b为6
//那么现在计算两个数的和,把它们的和放到另外一个变量c当中,所以c的值为11;
主要是除和模(求余数)的计算,可能很多人刚开始还不太习惯。
int a=15,b=3;
int c=a/b; //这里求15/3,所以c的值就是5
int d=a%5; //这里求15/3的余数是多少,所以d的值就是0,因为15/3商5,余0
下面来制作一个案例:交换两个数的位置,如int a=5,b=3; 现在要把它变为 a=3,b=5;
这里有几种做法:
第一种常见做法是:在内存中再申请一个变量c,把a的值赋值c,
然后再把b的值赋值给a,最后把c的值赋值给b; (图解)
代码如下:
int a=5,b=3;
int c=a;
a=b;
b=c;
图1 |
图2 |
图3 |
图4 |
第二种做法:
int a = 5, b = 3;
b = a+b-(a=b);
这种做法是在两个变量中进行的,首先要理解它的算法。
首先看图,这种写法可以很多人没有看到过。我们只知道=号代表赋值运算,能这样在与算术运算中,程序居然不会报错,真的是奇迹。 那么如何能这样写,程序运算的顺序又是怎么样的呢?看图,程序运算的过程为: (1)、a+b,得到的结果是8 (2)、a=b,把b的值3赋值给变量a,所以现在a=3; (3)、由图(1)-图(2)为,8-3=5,最后把5赋值给变量b 这样,就在不增加变量的情况下,交换了两个数字。 |
二、关系运算符
我们先来看一看日常生活中和C#程序中关系运算符的区别。
从上图可以看出,除了等于与不等于写法不一样外,其它的都一样。
在我们日常生活中经常会用到这些符号,现在只不过是用程序的方法把它实现。
如:2>3 , 4< 6 , 5==5 , 6!=7, “我”==”我”
在程序中,这样的判断得出的结果只有两种:一种是成立,一种为不成立。
在C#中有一种变量可以存储这样的值,它就是布尔(boolean或bool)变量。
bool类型只有两个值,true代表成立,false代表不成立
如:
bool a=3>4; 结果是:false(不成立)
bool b=(4==4); 结果是: true(成立)
三、逻辑运算符
用一句话连贯的英语单词来形容程序中的逻辑运算符,那就是not and or (如图):
用一句话连贯的中文来形容程序中的逻辑运算符,那就是与或非 (如图):
逻辑运算符是用在当要判断多个条件是否满足时的情况下使用。&&和 || 是有区别的
&& [and] :当所有的条件都满意成立的时候,才成立
|| [or] :当有一个条件成立时,就成立。
如图:
逻辑与 |
逻辑或 |
注意:在算术运算符、条件[比较]运算符、逻辑运算符和赋值运算符中,程序运行的先后顺序是:
! > 算术运算符 > 条件[比较]运算符 > && > || > =
由此可见:
逻辑运算符中的非 ! 运算符最高
算术运算符第二
条件[比较]运算符第三
逻辑运算符中的与 && 第四
逻辑运算符中的或者 || 第五
最后,赋值运算符(=)运算的级别最低
四、条件语句
在我们日常生活中,经常会问题这样的问题,如:
如果今天是星期天,我们就去看电影。
假如我买的彩票中了五百万,我就去渡假。
如果我有一辆车,我就开车去旅游等等。
像这样假设的条件,如果成立就做某些事情,在我们程序中有一专门的语句去实现它,那就是条件结构语句。
条件程序语句大概分为5大类,分别为:
(1) 简单if (2)if else (3)嵌套if (4)多重if (5)switch条件分支语句
1、 首先,我们先来看一看简单if
其语法为: |
|
if(条件语句)
{ } |
如:如果我中了五百万,我就去渡假。 int money=5; if(money>=5) { Console.WriteLine(“我中了五百万,我要去渡假。”); } |
2、 我们先来看一看if else结构
其语法为: |
|
if(条件语句)
{ } else { } |
如:如果我中了五百万,我就去渡假,否则我就继续支持福彩票事业。 int money=5; if(money>=5) { Console.WriteLine(“我中了五百万,我要去渡假。”); } else { Console.WriteLine(“继续支持福彩事业。”); } |
3、 我们先来看一看嵌套if结构(也就是if里面套if)
其语法为: |
|
if(条件语句)
{ if(条件语句) { } else { } } else { if(条件语句) { } } |
如:
|
选择题:以下变量命名正确的是( )
A、name、 _222*1、 9class、 public
B、_teacher、 void、 string、 myName
C、$Age、 corss、 fire、 _grade
D、_glass、 g23、 c_12、 my_first_2
5、变量的声明和赋值
1)定义变量的语法:
数据类型 变量名; (定义一个年龄的变量,年龄是整数,所以变量定义如下:)
int age; [系统会根据数据类型,在内存中分配不同大小的存储空间]
每个数据类型后面,可以定义多个变量,如:(定义姓名、家庭地址、籍贯、民族)
string name,address,origin,national ;
2)为变量赋值语法:
变量名 = 值;
(这里的=号表示赋值运算符,把=号右边的值,赋值给左边的变量名,最后以一个;[分号]结束)
如:年龄18岁,姓名为“小张”,家庭地址为“重庆南坪XXX”,
籍贯为“重庆”,民族为“汉”
age = 18 ;
name = “小张” ;
address = “重庆南坪XXX” ;
origin = “重庆” ;
national = “汉” ;
四、变量和常量的区别
变量:是指在程序的运行过程中随时可以发生变化的量
常量:是指在程序在运行过程中不会发生变化的变量
常量的特点:
1、必须在声明是赋值
2、不能在在程序运行时,给常量赋值
3、常量是静态的。不必须(实际上,是不允许)在常量声明中包含修饰符static
五、不同数据类型之间是如何转换的
在C#中数据类型转换分为两种:1)隐式[又叫自动]类型转换 2)显式[又叫强制]类型转换
举个简单例子:
飞机场里面停飞机,这是理所当然,我们把这种叫做隐式[又叫自动]类型转换
那如果我们反过来看一看,飞机里面装飞机场,这个在我们实际生活中,觉得这是根据不可能的,
但是程序可能做到这一点,我们把这种叫做显式[又叫强制]类型转换
在C#中数据类型转换分为两种:1)隐式[又叫自动]类型转换 2)显式[又叫强制]类型转换
举个简单例子:
飞机场里面停飞机,这是理所当然,我们把这种叫做隐式[又叫自动]类型转换
那如果我们反过来看一看,飞机里面装飞机场,这个在我们实际生活中,觉得这是根据不可能的,
但是程序可以做到这一点,我们把这种叫做显式[又叫强制]类型转换
double和int之间就是(飞机场与飞机)这种关系,我们可以这样理解,double的取值范围比int要大得多
所以double可以装得下int :
int a=1234;
double b=a; 系统会把a整型变量的值赋值给double变量b.这就是隐式[又叫自动]类型转换
那反过来:
double a=1234;
int b=a; //系统编译时会报错,如图:
那如何进行强制转换呢?c#提供了非常简便的方法,如:
double a=1234;
int b=(int)a; //这样就强制把double类型,转换为int类型
最后,再介绍一下,其它数据类型之间的转换(1、字符串转换为其它类型 2、任意类型之间的转换)
1)、字符串转换为其它类型
语法:
XX.Parse(字符串); 这里的xx代表的如:double,int,bool等
举个例子来说明一下:
string strValue=”123.45″; //这是一个字符串,时面的值是”123.45″
现要把它转换成小数类型,就可以使用double.Parse();来进行转换
double dValue=double.Parse(strValue);
2)、任意类型之间的转换
语法:
Convert.ToXX(任何类型);
如:把一个布尔类型转换为整型
bool a = true;
int b = Convert.ToInt16(a);
Console.WriteLine(“转换后的结果是:”+b); //转换后的结果是:1
ok, 经过以上的学习,我相信大家对C#的一些基础知识有一定的了解,那么下一章我将介绍C#的算术运算符、逻辑运算符、关系运算符,以及控制程序流的语句。
本文主要是讨论栈和堆的含义,也就是讨论C#的两种类据类型:值类型和引用类型;
虽然我们在.net中的框架类库中,大多是引用类型,但是我们程序员用得最多的还是值类型。
引用类型如:string,Object,class等总是在从托管堆上分配的,C#中new操作符返回对象的内存地址–也就是指向对象数据的内存地址。
以下是值类型与引用类型的表:
我们来看下面一段代码:
首先在类中声明一个class类,和一个struct结构,如图:
并使用在程序入口调用它们,如图:
现在我们来看一看,它们在内存当中是如何存储的?
从这张图可以看出,class(类)实例化出来的对象,指向了内存堆中分配的空间
struct(结构) 实例化出来的对象,是在内存栈中分配
接下来,我们再来在上面的程序做如下修改:
红框,代码定义一个class实例化对象s2,然后把对象s1赋值给s2
蓝框,代码定义一个结构实例化对象r2,然后把对象r1赋值给r2
那它们输出的结果是多少呢?请选择( c )
A、 s1的值为:12 s2的值为222
r1的值为:16 r2的值为666
B、 s1的值为:12 s2的值为222
r1的值为:666 r2的值为666
C、 s1的值为:222 s2的值为222
r1的值为:16 r2的值为666
D、 s1的值为:222 s2的值为222
r1的值为:666 r2的值为666
所以,值类型和引用类型的区别就是:
1、它们存储的位置不一样
2、如果是引用类型,当两个对象指向同一个地方,修改某一个的时候,其它对象的值会发生改变
我想在这个园子里面的新人,还是”掌门人”,都对”面向对象”这几字非常的耳熟了或者有一定的了解。
但当一个初学都在学习面向对象的时候,会遇到一些瓶颈和麻烦,认为面向对象非常的难以理解。
那么本章节主要是让大家了解面向对象,并系统地掌握面向对象编程的技能点,消除初学者的疑惑.
1、 如何去学习面向对象的编程?
2、 需要掌握的有哪些技能点?
一、如何去学习面向对象的编程?
首先要想要学习好面向对象编程,那么你就必须把一切的事物都能想到它的一些特性和行为。
如:现在你现在看到本篇的文章,你会想到什么?我想大部份人都会说,看到的是文字。
但是对于一个面向对象的编程者来说,它看到的应该是比文字还要多的东西。
如:字体的颜色、字数、文字的大小、文字的样式、文字的粗细,等等。。。。。
建议大家去youku上面去搜索一下,去搜索一下印度的“这个真牛”的视频,也许会对你的认识有帮助。
二、学习OOP需要掌握的有哪些技能点?
我用一个图来描述一下,大家首先必须要掌握的知识点
在图中,分别列出面向对象的三大特性
1、封装的特点:
1)、隐藏代码的实现,便于用户调用
2)、让代码与实现相分离
3)、在类的内部实现自由的修改
2、继承的特点:
减少重复的代码,便于程序的维护
3、多态的特点:
表示不同的对象在执行相同的动作的时候,通过自己内部来执行
想必大家对面向对象的三大特性,都非常了解,我这里只是简单的描述了一下。
请大家先了解一下,那么下一章,我们就开始面向对象的第一步,了解什么类和对象.