一 c#的运行方式
1.1 C#语言是Microsoft公司推出的面向对象的编程语言,可以快速编写各种基于.NET平台的应用。
C#语言不能孤立地使用,而必须和.NET Framework一起考虑。C#编译器专门用于.NET,C#编写的代码总是在.NET Framework中运行。
.NET Framework的核心是其运行环境,称为公共语言运行库(CLR)。通常将在CLR控制下运行的代码称为托管代码(managed code)。
在CLR执行编写好的源代码之前,需要编译它们。在.NET中,编译分为两个阶段:
①把源代码编译为公共中间语言(Common Intermediate Language,CIL);
②CLR把CIL编译为平台专用的代码。
CTS(通用类型系统)定义了可以在中间语言中使用的预定义数据类型,所有面向.NET Framework的语言都可以生成最终基于这些类型的编译代码。
在C#中声明一个int类型的数据时,声明的实际上是.NET结构System.Int32的一个实例。所以在语法上可以把所有的基本数据类型看作是支持某些方法的类。
int a=45;
string s=a.toString();
二
2.1:
C#的数据类型分为值类型和引用类型。
①值类型,直接存储其值,值存储于栈中。
②引用类型,存储对值的引用,而值存储在托管堆上。
C#的数据类型分为值类型和引用类型。
①值类型,直接存储其值,值存储于栈中。
②引用类型,存储对值的引用,而值存储在托管堆上。
2.2类类型
类是创建对象的模板。C#类封装有数据成员和函数成员。
①数据成员:字段、常量和事件。
②函数成员:方法、属性、构造函数、析构函数、运算符、索引器。
三
3.1定义类
(1)命名空间
命名空间是一种特殊的分类机制,它将与一个特定功能有关的所有类型都分组到一起。命名空间有助于防止类型名称发生冲突。
(2)using指令
可以用来将来自一个命名空间的类型导入,否则引用该命名空间中的类型要使用完全限定名。
(3)方法参数的种类
C#的方法可以使用如下4种参数:
①值参数
不含任何修饰符,默认的传值方式。赋给形参的是实参的一份拷贝。
②引用参数
以ref修饰符声明,赋给形参的是实参在内存中的地址,即形参是实参的引用。实参必须被设置初始值。
③输出参数
以out修饰符声明,输出形参用于把运算结果保存到外部变量。输出形参也是引用参数,调用前无需对实参变量初始化。
④数组参数
使用params说明,数组参数必须是参数表中最后一个参数,且只允许是一维数组,不能再有ref和out修饰符。声明了一个参数数组之后,就可以将每个参数作为参数数组的一个成员来访问,由此实现数量可变的参数。
样例:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace r3_1_1
{
class Program
{
static void DoStatistic(string type,params double[] nums)
{
double result =0.0;
switch(type)
{
case"sum":
//计算输入数组的和
for(int i = 0; i < nums.Length; i++ )
result += nums[i];
break;
case"avg":
//计算平均值
for(int i = 0; i < nums.Length;i ++)
result += nums[i];
result = result / nums.Length;
break;
};
Console.WriteLine("{0}: {1, 5:f2}",type, result);
}
static void Main(string[] args)
{
DoStatistic("sum", 13.5,15.5 );
DoStatistic("avg", 1, 2, 3, 4);
}
}
}
结果如下;
Tips:
C#的输出格式:
3.2 类的实例化
⑴ 用new运算符创建对象
样例:
class Student{
public static int id;
public static string name;
public static int score;
public static float GetScore()
{
return score;
}
Student(int sno, string sname){
id = sno;
name = sname;
}
}
class Program
{
static void Main(string[] args)
{
Student s = new Student(1, "zixuan");
Console.WriteLine("{0} {1} {2}", s.id, s.name, s.GetScore());
}
}
⑵ 对象初化器
class Program
{
static void Main(string[] args)
{
Student s = new Student() { id = 1, name = "王五" };
Console.WriteLine("{0} {1} {2}", s.id, s.name, s.GetScore());
}
}
⑶ 类型推断
定义变量时类型使用var关键字,编译器可以根据变量的初始化值推断变量的类型。
var s = new Student(1, "王五");
⑷ 匿名类型
匿名类型是一种特殊的类型,它最终由编译器声明。当编译器看到一个匿名类型时,会执行一些后台操作,帮你生成必要的代码,允许你像显式声明的那样使用它。
定义匿名类型的变量时,是不可能指定数据类型的,必须使用var。
class Program
{
static void Main(string[] args)
{
var s = new { Sno = 1, Sname = "李四" };
Console.WriteLine("{0},{1}", s.Sno, s.Sname);
}
}
3.3分布类
使用partial关键字可定义分部类。
使用分部类的主要目的是将一个类的定义划分到多个文件中。分部类对于代码生成或修改工具来说意义重大。
样例:
Student1.cs文件如下:
partial class Student
{
internal int id;
internal string name;
private int score;
//构造函数
public Student() { }
public Student(int id, string name)
{
this.id = id;
this.name = name;
}
public int GetScore()
{
return score;
//获取score;
}
public void setScore(int Score)
{
this.score = Score;
//设置Score
}
}
Program.cs如下:
partial class Student
{
override public string ToString()
{
return "id:" + id + " name:" + name + " score:" + score;
}
}
class Program
{
static void Main(string[] args)
{
Student s = new Student(1, "zixuan");
Console.WriteLine("{0}", s.ToString());
}
}
结果如下:
3.4类的属性成员
(1)如何定义类的属性成员
样例:
class Student
{
private int _id;
private string _name;
private double _score;
//构造函数
public Student(){}
public Student(int id, string name)
{
this._id= id;
this._name = name;
}
public int Id
{
get{return _id;}
set{_id = value;}
}
public string Name{
get{return _name;}
set{_name = value;}
}
public double Score{
get{return _score;}
set{//需要判断一下成绩是否小于0
if(value < 0)
_score = 0;
else
_score = value;
}
}
}
class Program
{
static void Main(string[] args)
{
//实例化对象
Student s = new Student(1, "zixuan");
s.Score = 80;
Console.WriteLine("{0} {1} {2}", s.Id,s.Name, s.Score);
}
}
(2)自动属性
当属性访问器中不需要任何其他逻辑时,自动实现的属性会使属性声明更加简洁。
class Student {
public int Id { get; set; }
public string Name { get; set; }
public double Score { get; set; }
public Student() { }
public Student(int id, string name) {
Id = id;
Name = name;
}
}
class Program {
static void Main(string[] args) {
Student s = new Student(1, "zixuan") { Score = 100 };
Console.WriteLine("{0} {1} {2}\n", s.Id, s.Name, s.Score);
}
}
C#的面向对象编程