C#基础
前、介绍
命名空间是把相关类组合在一起的方式;namespace关键字声明了应与类相关的名称空间;编译器在using语句指定的名称空间中查找没有在当前命名空间中定义但在代码中引用的类。
所有的C#代码都必须包含在一个类中。
方法定义方式:修饰符 返回类型 方法名 (参数) { }。
必须有一个Main()方法作为程序入口点;该方法要么没有返回值(void),要么返回一个整数(int)。
一、变量和常量
1.声明变量
声明单独类型多个变量: int x = 10, y = 20;
2.变量初始化
- 变量是类或结构中的字段,如果没有显示初始化,创建这些变量时,其值默认是0;
- 方法的局部变量必须在代码中显示初始化,之后才能在语句中使用它们的值。此时,初始化不是在声明该变量时进行的。但编译器会通过方法检查所有可能的路径,如果检测到局部变量在初始化之前就使用了它的值,就会产生错误。
类型推断var:
- 变量必须初始化
- 初始化器不能为空
- 初始化器唏嘘放在表达式中
- 不能把初始化器设置为一个对象,除非在初始化器中创建了一个新对象
var name = "Bugs Bunny";
var age = 25;
var isRabbit = true;
Type nameType = name.GetType();
Type ageType = age.GetType();
Type isRabbitType = isRabbit.GetType();
Console.WriteLine("name is type " + nameType.ToString());
Console.WriteLine("age is type " + ageType.ToString());
Console.WriteLine("isRabbit is type " + isRabbitType.ToString());
输出结果为:
name is type System.String age is type System.Int32 isRabbit is type System.Boolean 请按任意键继续. . .
3.变量作用域
- 类在某作用域内,其成员变量也在该作用域内;
- 局部变量 存在于表示该变量的块语句或方法结束的封闭花括号之前的作用域内;
- 在for、while或类似语句中的局部变量作用于该循环体中。
类级别变量和方法内同名变量不冲突。
class Program
{
//引用类级别变量 object.fieldname
static int i = 20;
public static void Main()
{
int i = 30;
Console.WriteLine(i);
Console.WriteLine(Program.i);
}
}
输出结果为:
30 20 请按任意键继续. . .
4.常量
使用const
关键字声明。
const int a = 100
- 声明时必须初始化
- 常量的值必须能在编译时用于计算,不能用从一个变量中提取的值来初始化常量
- 常量总是静态的
二、预定义数据类型
1.值类型和引用类型
值类型:
直接存储其值
存储在堆栈中
引用类型:
存储对值的引用
存储在托管堆上
把基本类型(如int和bool)规定为值类型;而把包含许多字段的较大类型(通常在有类的情况下)规定为引用类型。如果要把自己的类型定义为值类型,就应把它声明为一个结构。
C#有15个预定义类型,13个值类型,2个(string、object)引用类型。
预定义的值类型
名称 | 说明 |
---|---|
整形 | |
sbyte | 8位有符号的整数 |
short | 16位有符号的整数 |
int | 32位有符号的整数 |
long | 64位有符号的整数 |
byte | 8位无符号的整数 |
ushhort | 16位无符号的整数 |
uint | 32位无符号的整数 |
ulong | 64位无符号的整数 |
浮点类型 | |
float | 32位单精度浮点数(7位) |
double | 64位双精度浮点数(15/16位) |
decimal类型 | |
decimal | 128位高精度十进制数表示法(28位) |
bool类型 | |
bool | 表示true或false |
字符类型 | |
char | 表示一个16位的(Unicode)字符 |
- byte类型在默认状态下是无符号的,其中有符号的版本有一个特殊的名称sbyte。
- 所有整数类型的变量都能赋予十进制或十六进制,十六进制需要0x前缀:
long x = 0x12ab;
- 如果对一个整数是int、uint、long或ulong没有任何显式的声明,则该变量默认为int类型。为了把键入的值指定为其它整数类型,可以使用U/L字符:
uint ui = 1234U; long l = 1234L; ulong ul = 1234UL;
- 如果在代码中没有对某个非整数值硬编码,则编译器一般假定该变量是double。如果要指定该值为float,可以在其后加上字符F:
float f = 12.3F;
- 要把数字指定为decimal类型,可以在数字后加上字符M:
decimal d = 12.30M;
- char类型的字面量使用单引号括起来的。除了吧char表示为字符字面量之外,还可以用4位十六进制的Unicode(例如 '\u0041'),带数据类型转换的整数值(例如 (char)65),或十六进制数('\x0041')表示它们。它们还可以用转义序列表示,如下表所示:
转义序列 | 字符 |
---|---|
' | 单引号 |
'' | 双引号 |
\ | 反斜杠 |
\0 | 空 |
\a | 警告 |
\b | 退格 |
\f | 换页 |
\n | 换行 |
\r | 回车 |
\t | 水平制表符 |
\v | 垂直制表符 |
预定义引用类型
名称 | 说明 |
---|---|
object | 根类型,CTS中的其他类型都是从它派生而来的(包括值类型) |
string | Unicode字符串 |
object类型就是最终的父类型,所有内置类型和用户定义的类型都是从它派生而来。
- object类型
可以使用object引用绑定任何子类型的对象。比如把堆栈中的一个值对象装箱,移动到堆中。object引用也可以用于反射。
object类型实现了许多一般用途的基本方法:Equals(),GetHashCode(),GetType(),ToString()
Equals与==的区别: Equals比较的永远是变量的内容是否相同,而= =比较的则是引用地址是否相同。string 类型是个特例,因为他的内部对这两个都进行了重写。
详析GetHashCode方法。
- string类型
string s1 = "a string";
string s2 = s1;
Console.WriteLine("s1 is " + s1); // s1 is a string
Console.WriteLine("s2 is " + s2); // s2 is a string
s1 = "another string";
Console.WriteLine("s1 now is " + s1); // s1 now is another string
Console.WriteLine("s2 now is " + s2); // s2 now is a string
字符串字面量前面加@,这个字符后的字符都不会被转义,可以换行。
string filepath = "C:\\CSharp\\First.cs";
strng filepath = @"C:\CSharp\First.cs"
流控制
- 条件语句
switch case
public class Program
{
static void Main(string[] args)
{
//switch case
string input = Console.ReadLine();
try
{
Weeks inputs = (Weeks)Enum.Parse(typeof(Weeks), input);
Console.WriteLine("您输入的是: " + SwitchEnum(inputs));
}
catch (Exception e)
{
Console.WriteLine(e.Message);
}
finally
{
Console.WriteLine("Program over!");
}
}
}
public enum Weeks { Mon = 1, Tues = 2, Wednes = 3, Thurs = 4, Fri = 5, Satur = 6, Sun = 7, Sunday = 0 }
public static string SwitchEnum(Weeks week)
{
string result = string.Empty;
switch (week)
{
case Weeks.Mon:
result = "星期一";
break;
case Weeks.Tues:
result = "星期二";
break;
case Weeks.Wednes:
result = "星期三";
break;
case Weeks.Thurs:
result = "星期四";
break;
case Weeks.Fri:
result = "星期五";
break;
case Weeks.Satur:
result = "星期六";
break;
case Weeks.Sun:
case Weeks.Sunday:
result = "星期日";
break;
default:
result = "什么J8?";
break;
}
return result;
}
未完待续... Page.40 - 2017年2月22日22:35:31