C# 是一种面向对象的编程语言。在面向对象的程序设计方法中,程序由各种相互交互的对象组成。相同种类的对象通常具有相同的类型,或者说,是在相同的 class 中。
一个 Rectangle(矩形)类的实现:
using System;
namespace RectangleApplication
{
class Rectangle
{
// 成员变量
double length;
double width;
public void Acceptdetails()
{
length = 4.5;
width = 3.5;
}
public double GetArea()
{
return length * width;
}
public void Display()
{
Console.WriteLine("Length: {0}", length);
Console.WriteLine("Width: {0}", width);
Console.WriteLine("Area: {0}", GetArea());
}
}
class ExecuteRectangle
{
static void Main(string[] args)
{
Rectangle r = new Rectangle();
r.Acceptdetails();
r.Display();
Console.ReadLine();
}
}
}
当上面的代码被编译和执行时,它会产生下列结果:
Length: 4.5
Width: 3.5
Area: 15.75
using关键字
在任何 C# 程序中的第一条语句都是: using System
using关键字用于在程序中包含命名空间。一个程序可以包含多个using语句。
class关键字
class关键字用于声明一个类。
C#中的注释
多行注释以 ‘/* */ ‘
单行注释 ‘//‘
成员变量
变量是类的属性或数据成员,用于存储数据。
在上面的程序中,Rectangle 类有两个成员变量,名为 length 和 width。
成员函数
函数是一系列执行指定任务的语句。类的成员函数是在类内声明的。
类 Rectangle 包含了三个成员函数: AcceptDetails、GetArea 和 Display。
实例化一个类
在上面的程序中,类 ExecuteRectangle 是一个包含 Main() 方法和实例化 Rectangle 类的类。
==直白地解释就是==:通过已有的类(class)创建出该类的一个对象(object),这一过程就叫做类的实例化。
==打个比方==:你设计了一个飞机模型,交给工人师傅去加工制作,生产出一个(一批)飞机。飞机模型就相当于程序中的类,生产出来的飞机就是对象,生产飞机这一过程就叫做类的实例化。
MyPlane plane1= new MyPlane(); //类的实例化
标识符
标识符是用来识别类、变量、函数或任何其它用户定义的项目。在 C# 中,类的命名必须遵循如下基本规则:
标识符必须以字母、下划线或 @ 开头,后面可以跟一系列的字母、数字( 0 - 9 )、下划线( _ )、@。
标识符中的第一个字符不能是数字。
标识符必须不包含任何嵌入的空格或符号,比如 ? - +! # % ^ & * ( ) [ ] { } . ; : " ‘ / 。
标识符不能是 C# 关键字。除非它们有一个 @ 前缀。 例如,@if 是有效的标识符,但 if 不是,因为 if 是关键字。
标识符必须区分大小写。大写字母和小写字母被认为是不同的字母。
不能与C#的类库名称相同。
C# 关键字
关键字是 C# 编译器预定义的保留字。这些关键字不能用作标识符,但是,如果您想使用这些关键字作为标识符,可以在关键字前面加上 @ 字符作为前缀。
在 C# 中,有些关键字在代码的上下文中有特殊的意义,如 get 和 set,这些被称为上下文关键字(contextual keywords)
***
数据类型
- 值类型:
int``````float``````double``````bool
等- 1.不能从值类型派生新类型,但可以结构实现接口
- 2.值类型不能包含 null 值
- 3.每个值类型都具有一个初始化该类型的默认值的隐式默认构造函数
- 引用类型:自定义引用类型有class、interface、delegate
- 对象类型object:值类型转换为对象类型是装箱;对象类型转换为值类型是拆箱
- 只有装过箱的数据才能拆箱
object obj; obj = 100; //这是装箱 int val = 8; object obj = val;//整型数据转换为了对象类型(装箱) int val = 8; object obj = val;//先装箱 int nval = (int)obj;//再拆箱
- 动态类型dynamic
dynamic <variable_name> = value; dynamic d = 20;
- 字符串类型string ==(待补充)==
String str = "study"; @"study";//等价 string str = @"C:\Windows"; string str = "C:\\Windows";//等价 /*这里的String和string有不同 string是C#里的类,String是.net Framework的类 (待补充)*/
-
指针类型
类型转换
类型转换从根本上说是类型铸造,或者说是把数据从一种类型转换为另一种类型。在 C# 中,类型铸造有两种形式:
- 隐式类型转换 - 这些转换是 C# 默认的以安全方式进行的转换, 不会导致数据丢失。例如,从小的整数类型转换为大的整数类型,从派生类转换为基类。
- 显式类型转换 - 显式类型转换,即强制类型转换。显式转换需要强制转换运算符,而且强制转换会造成数据丢失。
隐式类型转换:
namespace TypeConvertion
{ class Class1
{
}
class Class2 : Class1 //类Class2是类Class1的子类
{
}
class Program
{
static void Main(string[] args)
{
int inum = 100;
long lnum = inum; // 进行了隐式转换,将 int 型(数据范围小)数据转换为了 long 型(数据范围大)的数据
Class1 c1 = new Class2(); // 这里也是隐式转换,将一个新建的 Class2 实例转换为了其基类 Class1 类型的实例 C1
}
}
}
显式类型转换例1:
namespace TypeConversionApplication
{
class ExplicitConversion
{
static void Main(string[] args)
{
double d = 5673.74;
int i;
// 强制转换 double 为 int
i = (int)d;
Console.WriteLine(i);
Console.ReadKey();
}
}
}
结果:
5673
显式类型转换例2:
double dnum = 100.1;
int ifromd = (int)dnum; //double类型显式转换转为int类型
Class1 c11 = new Class1();
Class2 c22 = c11 as Class2; //使用as进行显式转换
Console.WriteLine(c22 is Class1);
Console.WriteLine(c22 is Class2);
结果:
FALSE
FALSE
C#类型转换方法
序号 | 方法 | 描述 |
---|---|---|
1 | ToBoolean | 如果可能的话,把类型转换为布尔型 |
2 | ToByte | 把类型转换为字节类型 |
3 | ToChar | 如果可能的话,把类型转换为单个 Unicode 字符类型 |
4 | ToDateTime | 把类型(整数或字符串类型)转换为 日期-时间 结构 |
5 | ToDecimal | 把浮点型或整数类型转换为十进制类型 |
6 | ToDouble | 把类型转换为双精度浮点型 |
7 | ToInt16 | 把类型转换为 16 位整数类型 |
8 | ToInt32 | 把类型转换为 32 位整数类型 |
9 | ToInt64 | 把类型转换为 64 位整数类型 |
10 | ToSbyte | 把类型转换为有符号字节类型 |
11 | ToSingle | 把类型转换为小浮点数类型 |
12 | ToString | 把类型转换为字符串类型 |
13 | ToType | 把类型转换为指定类型 |
14 | ToUInt16 | 把类型转换为 16 位无符号整数类型 |
15 | ToUInt32 | 把类型转换为 32 位无符号整数类型 |
16 | ToUInt64 | 把类型转换为 64 位无符号整数类型 |
把不同值的类型转换为字符串类型:
namespace TypeConversionApplication
{
class StringConversion
{
static void Main(string[] args)
{
int i = 75;
float f = 53.005f;
double d = 2345.7652;
bool b = true;
Console.WriteLine(i.ToString());
Console.WriteLine(f.ToString());
Console.WriteLine(d.ToString());
Console.WriteLine(b.ToString());
Console.ReadKey();
}
}
}
结果:
75
53.005
2345.7652
True
类型之间的转换 - Convert 和 Parse(以下摘自菜鸟教程)
string locstr = 123.ToString();
//如果要将"locstr"转成整型数
//方法一: 用 Convert
int i = Convert.ToInt16(locstr);
//方法二: 用 Parse
int ii = int.Parse(locstr);
Convert.ToInt32() 与 int.Parse() 的区别
没搞清楚 Convert.ToInt32 和 int.Parse() 的细细微区别时千万别乱用,否则可能会产生无法预料的结果,举例来说:假如从 url 中取一个参数 page 的值,我们知道这个值是一个 int,所以即可以用 Convert.ToInt32(Request.QueryString["page"]),也可以用 int.Parse(Request.QueryString["page"]),但是如果 page 这个参数在 url 中不存在,那么前者将返回 0,0 可能是一个有效的值,所以你不知道 url 中原来根本就没有这个参数而继续进行下一下的处理,这就可能产生意想不到的效果,而用后一种办法的话没有 page 这个参数会抛出异常,我们可以捕获异常然后再做相应的处理,比如提示用户缺少参数,而不是把参数值当做 0 来处理。
(1) 这两个方法的最大不同是它们对 null 值的处理方法: Convert.ToInt32(null) 会返回 0 而不会产生任何异常,但 int.Parse(null) 则会产生异常。
(2) 对数据进行四舍五入时候的区别
- a. Convert.ToInt32(double value) 如果 value 为两个整数中间的数字,则返回二者中的偶数;即 3.5 转换为 4,4.5 转换为 4,而 5.5 转换为 6。不过 4.6 可以转换为 5,4.4 转换为 4 。
- b. int.Parse("4.5") 直接报错:"输入字符串的格式不正确"。
- c. int(4.6) = 4 Int 转化其他数值类型为 Int 时没有四舍五入,强制转换。
(3) 对被转换类型的区别 int.Parse 是转换 String 为 int, Convert.ToInt32 是转换继承自 Object 的对象为 int 的(可以有很多其它类型的数据)。你得到一个 object 对象, 你想把它转换为 int, 用 int.Parse 就不可以, 要用 Convert.ToInt32。
***
int.TryParse(string s,out int i)
该方式也是将数字内容的字符串转换为int类型,但是该方式比int.Parse(string s) 好一些,它不会出现异常,最后一个参数result是输出值,如果转换成功则输出相应的值,转换失败则输出0。
class test
{
static void Main(string[] args)
{
string s1="abcd";
string s2="1234";
int a,b;
bool bo1=int.TryParse(s1,out a);
Console.WriteLine(s1+" "+bo1+" "+a);
bool bo2=int.TryParse(s2,out b);
Console.WriteLine(s2+" "+bo2+" "+b);
}
}
结果输出:
abcd False 0
1234 True 1234