C#语言基础
一、C#语法基础
.NET概述
.NET是基于Windows平台的一种技术。包含了能在.NET Framework平台运行的所有编程语言。它包含了一个庞大的代码库,各种能运行在.NET Framework平台上的语言都可以共享这个代码库。
认识C#程序
C#(发音为 C Sharp)是一门完全面向对象的语言,也是Microsoft.NET平台运行的主流语言。
书写规范:C#中大括号"{“和”}"各占据新的一行
以下为一个普通的C#程序示例:
using System;
namespace HelloWorld
{
class Program
{
static void Main(string [] args)
{
Console.WriteLine("Hello World");
Console.ReadLine();
}
}
}
以上代码的组成部分 一 一 说明:
1.namespace关键字
namespace(命名空间)是C#中组织代码的方式,它的作用类似于Java中的package(包),可以大大的提高管理和使用效率。
2.using关键字
在C#中,使用using关键字来引用其他命名空间,它的作用和Java中的import类似
3.class关键字
C#是一门完全面向对象的语言,使用class关键字表示类。编写的代码都应该包含在一个类中,类要包含在一个命名空间中
4.Main()方法
C#中的Main()方法与Java中的一样,都是程序运行的入口。但要注意的是,C#中的Main()方法首字母必须大写,方法的返回值可以是void或者int类型,Main()可以没有命令行参数。
语法有四种
static void Main(string [] args){}
static int Main(string [] args){}
static void Main(){}
static int Main(){}
以上都是C#中的Main()方法语法。
5.关键代码
Main()方法中添加的两行代码就是这个小程序的关键代码,用于输出和输入
Console.WriteLine(); //从控制台输出内容 输出后换行
Console.Write(); //从控制台输出内容 输出后不换行
Console.ReadLine(); //从控制台输入内容
C#中的变量和常量
C#中的数据类型
常用的数据类型 | Java | C# | 举例 |
---|---|---|---|
整型 | int | int | 年龄 |
浮点型 | float | float | 成绩 |
双精度型 | double | double | 圆周率 |
字符串型 | String | string | 姓名 |
布尔型 | boolean | bool | 是否正确 |
C#中的布尔型关键字与Java不同,使用的是bool,C#中字符串型的关键字首字母是小写的
当然C#中的数据类型也不止这些,也包括Java中的基本数据类型,引用数据类型。
需要注意的是数组与Java中有所不同
声明不同。Java有两种方式,而C#只有一种,如下:
数据类型 [] 数组名;
赋值不同,Java中不能赋值的同时给长度,而C#可以:
数据类型 [] 数组名 = new 数据类型[长度]{值};
但是长度必须与值的个数一致
C#中的变量
C#中的变量声明方式使用的语法为
数据类型 变量名称;
C#中的变量命名规则与Java基本相同,有两点不同:1.不能包含“$”符号,2.不能以数字开头。
总结变量命名规则
1、以字母、数字、" _ " 组成,除此之外不能包含其他任意字符。
2、只能以字母和 " _ " 开头。
3、不能使用C#中的关键字,不能包含任意特殊字符。
4、使用驼峰命名法命名,即第一个单词首字母小写,其他单词首字母大写。
C#中的常量
用于在程序中一旦设定就不允许被修改的值,语法:
const 数据类型 常量名 = 值;
需要使用const关键字修饰。
如何使用:用于程序中被经常引用的值、用于程序中具有特定含义的值。
C#中的Console类
C#向控制台输出
有三种方法:
Console.WriteLine();
Console.WriteLine(要输出的值);
Console.WriteLine("格式字符串",变量列表);
第三中方式中,WriteLine()的参数由两部分组成:格式字符串和变量列表。在格式字符串中,依次使用{0}、{1}、{2}···代表要输出的变量,{0}这些表示占位符,将变量依次排列在变量列表中,{0}表示变量列表第一个变量,{1}表示变量列表的第二个变量,以此类推。
C#向控制台输入
语法:Console.ReadLine();
该语法只是用于往控制台输入字符串类型,但是需要输入其他类型时就需要类型转换了:
类型转换
1、隐式:自动转换
在类中当一个数据类型比另一个大时(包含),就可以自动转换,例如
int b = 1;
long a = b;
2、强转
有两种:
1、数据类型.Parse(String);
这种类型只是用于string类型转换为其他类型,不接受其他数据类型作为参数。
2、Convert.To数据类型(任意数据类型)
Convert类可以在各种基本类型之间执行数据类型的互相转换。Convert类为每种类型转换都提供了一个对应的方法,如下表所示:
方法 | 说明 |
---|---|
Convert.ToInt32() | 转换为整型(int 型) |
Convert.ToSingle() | 转换为单精度浮点型(float 型) |
Convert.ToDouble() | 转换为双精度浮点型(float 型) |
Convert.ToString() | 转换为字符串类型(string 型) |
这些方法中的参数就是需要转换的数据
类和对象
C#中类的成员分为三个:字段、属性、方法。
字段通常是私有的。如果要访问类中的字段,需要通过get和set访问器实现,这种结合了字段和方法的实现方式称之为属性。
类的三大特性:封装、继承、多态。这里主要说封装。
自定义方法
[访问修饰符] 返回值类型 方法名 (参数列表)
{
//方法的主体
}
访问修饰符:
private(私有的): 只有当前类能访问
protected(受保护的): 只有当前项目能访问
public(公开的): 不受限制。任何类都可以访问
internal(默认的): 与受保护的相同
方法的返回值类型:可以是基本数据类型的 如果不需要返回值需要使用void关键字。
方法名:每个自定义的方法都有一个方法名。命名方式使用帕斯卡命名法,即每个单词首字母大写。
参数列表:调用方法时,可以向方法中传递参数,这些参数构成了参数列表。
方法主体:方法主体就是这个方法实现某一特定功能的代码。
C#属性
1.用方法保证数据安全
2.用属性实现字段封装:
封装是将数据和操作方法保存在一起的技术,或者有选择的隐藏或公开类中的属性和方法。
private string name;
public string name
{
get{return name;} //只读
set{name=value;} //赋值(只写属性)
}
get:用来返回相应的私有字段的值,必须有return。
set:用来设定相应的私有字段的值。需要赋值。
this关键字
使用this关键字可以解决成员变量和局部变量名称的冲突问题。
this是当前类的引用,不能在静态成员中引用。
this关键字代表的是当前的对象,在类的内部,可以用this关键字访问类的成员。
值传递和引用传递
当方法为有参方法时,就需要传递参数,这里就涉及到了实参与形参之间的相互影响。
值传递:分为基本数据类型和引用数据类型:
基本数据类型:形参所作修改不会影响实参。
引用数据类型:形参如果修改具体的值会影响实参。修改的是地址对实参没有影响。
引用传递: 无论是形参还是实参所作修改都会受影响。实参与形参都需要ref关键字。
public void 方法名(ref 参数1,ref 参数2,···) //形参
{
......
}
this.方法名(ref 参数1,···) //实参
//以上形参所做改变无论如何都会影响实参。
二、C#中的结构类型
1、顺序结构
就是程序按照顺序,自上而下每一句代码都会执行。
2、选择结构
与Java结构中相同,只有满足某个条件才会执行该代码块,否则不执行。
if结构
语法:
if(条件表达式)
{
//代码块
}
if-else结构
语法:
if(条件表达式)
{
//代码块1
}
else
{
//代码块2
}
多重if结构
语法:
if(条件表达式1)
{
//代码块1
}
else if(条件表达式2)
{
//代码块2
}
else
{
//代码块3
}
嵌套if结构
语法:
if(条件表达式1)
{
if(条件表达式2)
{
//代码块1
}
else
{
//代码块2
}
}
else
{
//代码块3
}
if结构书写代码规范
1、为了使if结构更加清晰,应该把每个if或else包含的语句都用大括号括起来
2、相匹配的一队if和else应该左对齐
3、内层的if结构相对于外层的if结构要有一定的缩进
switch选择结构
C#的switch结构与Java略有不同,C#要求每个case和default语句中都必须要有break语句,除非两个case中间没有其他语句,那么前一个case可以不包括break,C#中的判断更加灵活,判断的表达式或变量可以是字符串类型,语法如下:
Java C#
switch(表达式) switch(表达式)
{ {
case 常量表达式1: case 常量表达式1:
//语句1; //语句1;
break;/*可以没有*/ break;//必须有
case 常量表达式2: case 常量表达式2:
//语句2; //语句2;
break;/*可以没有*/ break;//必须有
······ ······
default: default:
//语句n; //语句n;
break;/*可以没有*/ break;//必须有
} }
注意:
switch 结构中case子句的摆放是没有顺序的,可以把default子句放在最前面,但要注意任何两个case语句不能具有相同的值。case子句中的值必须是常量表达式,不允许使用变量。
3、循环结构
与Java结构中相同,只有满足条件才会循环。
while循环
语法:
while(条件表达式) //先判断条件是否满足,如果条件成立就执行循环体
{
//代码块
}
do-while循环
语法:
do //先执行再判断条件,至少执行一次
{
//代码块
}while(条件表达式);
for循环
语法:
for(表达式1;表达式2,表达式3)
{
//代码块
}
与Java中的相同,可以去我之前写的博客参考一下。
foreach循环
语法:
foreach(元素类型 元素变量名 in 数组)
{
//代码块
}
在语法中,元素类型值的就是数据类型,“元素”是一个只读变量。
each是每个的意思,foreach循环结构用于遍历一个数据集合的每一项。
注意:foreach结构不能改变数组中各元素的值;如果需要改变数组中元素的值,应该使用for循环。
循环的区别:
while循环:先判断条件是否成立,若条件成立,则执行循环条件。
do—while循环:循环体先执行一次,再判断条件是否成立。
for循环:必须使用整型变量做循环变量计算器。
foreach循环:用于遍历给定数组的所有值。
跳转语句
与java里的相同,在C#中的跳转语句也是一样的。
break
除了在switch结构中使用break退出整个case语句外,也可以用于while,do—while循环等,break语句将程序跳出当前循环结构,并继续执行该循环体后面的语句。
continue
与break语句类似,continue的作用与Java是相同的即跳出本次循环进入下一轮循环。
冒泡排序
冒泡排序就像它的名称一样,冒泡排序是从底层的元素开始,比较它和它上方紧挨着的元素,如果下面的元素小于上面的元素,就交换它的位置,否则保持原样,如此重复下去,直到所有的元素按从小到大的顺序排列。使用二重循环来排列。内层循环控制循环条件,外层循环控制次数。
冒泡排序速记(升序):
1.N个数字来排队,两两相比小靠前。
2.外层循环N-1,内层循环N-1-I。
3.如果要降序排列,只要把程序中的大于号换成小于号。
三、深入了解string类
常用的字符串处理方法
方法 | 说明 |
---|---|
string Trim() | 去掉字符串前后两端多余的空格 |
bool Equals(string value) | 比较一个字符串与另一个字符串value的值是否相等,若两者相等,返回true否则 返回false |
int IndexOf(string value) | 获取value在当前字符串中出现的首个位置 |
int lastIndexOf(string value) | 获取指定的字符串value在当前字符串中最后一个匹配的位置 |
string Substring(int sta) | 从指定位置sta开始检索长度为length的字符串 |
string ToUpper() | 获得字符串大写的形式 |
string ToLower() | 获得字符串的小写形式 |
string []Split(char separator) | 用指定的分隔符separator分割字符串,返回分割后字符串的数组 |
int Compare(string A,strin g B) | 比较两个字符串的大小关系,返回一个整数。若前者大,返回值大于0,反正则小于0,相等就返回0 |
注意:比较“==”和“Equals()”方法:
运算符""和“Equals()”应用于两个字符串,所判断的内容是有区别的,简单来说”“判断的是两个字符串对象在内存中的首地址,即判断是否是同一个对象。
“Equals()”方法判断的是两个字符串对象的值是否相等。
连接和分割字符串
两种方法 Join()和Split()方法。
//输入提示
Console.WriteLine("请输入一个字符串");
string input=Console.Readine();
//以空格作为分隔符分割字符串
a=input.Split(' ');
//将分割后的字符串使用下划线连接
b=input.Join("-",input);
Format格式化
C#的string类提供的一个Format()方法对输出的字符串进行格式化,Format()方法允许把字符串,数字或布尔类型变量插到格式化字符中。语法如下
String myString =String.Format("格式化字符串",参数列表);
{索引 [,对齐] [: 格式字符串]}
例如:
String myString =String.Format("{0} 乘以 {1} 等于 {2}",2,3,2*3);
//输出2*3=6;
格式化数值结果表
字符 | 说明 | 示例 | 输出 |
---|---|---|---|
C | 货币形式 | String.Format("{0:C3}",2000) | ¥2000.00 |
D | 十进制形式 | String.Format("{0:D3}",2000) | 2000 |
F | 小数点后的位数固定 | String.Format("{0:F3}",2000) | 2000.000 |
N | 用逗号(,)隔开的数字 | String.Format("{0:N}",25000) | 250.000 |
P | 百分比计数字 | String.Format("{0:P3}",0.29768) | 29.768 |
X | 十六进制格式 | String.Format("{0:X000}",12) | C |
C#中的字符串与Java中的相差无几。只是多了几个方法,并无大碍。