nullC++与C#*C++与C# 第六章 C#基本语言* 第六章 C#基本语言null*C#
完全面向对象的
事件驱动的
可视化编程语言null*1.1 创建C# Console程序.NET中新建项目null*null*名字可以改变null*1.2 程序结构C#的程序文件后缀为.cs
C#的基本
:类(class),C#中没有全局变量、常量和全局函数
一个可执行程序中有且只有一个类包含Main成员函数:
static void Main ( string [ ] args )
{
……
}程序入口null* class Class1
{
private int num;
private int sum;
static void Main(string[] args)
{
num = 10;
int result = calSum();
}
void setNum ( int v)
{
num = v;
}
int calSum( )
{
sum = 0;
for ( int i=1;i<=num;i++)
sum+=i;
return sum;
}
}null*名字空间:
同一工程中的类定义缺省放在同一名字空间中,空间名字与工程名字相同
使用名字空间:
using System;
使用某一名字空间时,必须添加相应组件引用
System名字空间和组件是自动添加的null*null*null*1.3 预定义数据类型利用数据类型定义变量的方式与C++相同null*注意:
C#中隐式转换只允许从“窄类型”向“宽类型”转换
显式类型转换与C语言相同 double d = 10.5;
int i = d; System中:Int64,Int32,Double等类可以将字符串分别转换成64, 32的整型或浮点型:
string str1=“12”, str2 =“16”,str3=“12.5”;
int i = Int32.Parse(str1);
long l = Int64.Parse(str2);
double d = Double.Parse(str3);null*string变量可以和另一数据类型的值连接生成更长的字符串:
string str1 = “He has ”;
Console.WriteLine ( str1+2+“ books.” );
//He has 2 books.利用System中的String类格式化字符串:
decimal amount = (decimal) 100.00;
string str = String.Format ( “{0:C}”, amount);
// str为: ¥100.00null*1.4 值类型和引用类型值类型:定义的变量包含该类型的值,预定义的各种数据类型都是值类型。(变量和值绑在一起)
引用类型:定义的变量包含数值在内存中存储的地址,自定义的类都是引用类型。int i = 2;
int j = i;
j = 3;2i2j3注意:缺省情况下,值类型作为参数传递时是按值传递的,引用类型作为参数传递时是按地址传递的。null*static void swap ( int a, int b)
{
int temp = a;
a = b;
b = temp;
}无法交换int a = 10, b = 20;
swap (a,b);c#提供了ref和out关键字:
ref指定值类型参数按引用传递
C#规定实参必须有初始值,否则出现编译错误,但out可以指定实参无初始值,被调用的函数负责赋值。static void swap (ref int a, ref int b)
{
int temp = a;
a = b;
b = temp;
}swap ( ref a, ref b );null*void sum ( int up, out int v )
{
v = 0;
for ( int i=1;i<=up;i++)
v+=i;
}int up = 10;
int result;
sum ( up, out result );null*1.5 控制台下的
输入输出System空间中的Console类提供输入、输出操作:
Console.WriteLine(“Hello world!”);
string str = Console.ReadLine();string name = “John”;
Console.WriteLine(“Welcome to you , {0} !”, name); 输出后面的第一个变量null*1.6 运算符和控制结构C#继承了C++中的各种运算符和控制结构与C++的区别:
switch的不可贯穿性:char ch;
int a=b=c=0;
……
switch (ch) {
case ‘a’:
a++;
case ‘b’:
b++;
case ‘c’:
c++;
}不能通过编译:若case后有语句块,则必须包含break;break;break;break;null*char ch;
int ab=c=0;
……
switch (ch) {
case ‘a’:
case ‘b’:
ab++;
break;
case ‘c’:
c++;
break;
}null*1.7 类的定义类的定义格式:
限定符 class 类名 : 基类 {
……
……
}public class Time {
……
}
public class StdTime : Time {
……
}继承,没有继承类型,C#只支持单继承null*public class Time
{
private int hour;
private int minute;
private int second;
public Time(int h,int m, int s)
{
setTime(h,m,s);
}
public Time()
{
setTime(0,0,0);
}
public void setTime(int h, int m, int s)
{
hour = h;
minute = m;
second = s;
}
}隐含继承自System.Object类,
C#中所有的类都直接或间接继承自System.Object类构造和析构函数与C++的概念类似null*类前的限定符:
public:默认限定符,
示任何地方都可以使用此类;
internal:只能在当前程序或类库(.dll)中使用此类;
abstract:抽象类;
sealed:密封类(不能被继承的类)。类中的每个成员变量或成员函数定义前都必须有成员访问限定符,比C++多了internal限定符:只能在当前程序或类库中访问该成员。缺省为private。null*public class StdTime : Time
{
private string std;
public StdTime()
{
this.std = "AM";
}
public StdTime(int h, int m, int s) :base(h,m,s)
{
if((h>=0)&&(h<12))
std = "AM";
else
std = "PM";
}
new public void setTime(int h, int m, int s)
{
base.setTime(h,m,s);
if((h>=0)&&(h<12))
std = "AM";
else
std = "PM";
}
}向基类构造函数传输初始化参数this引用new限定符表示该函数覆盖基类同名函数null*C#中,类的成员函数在类体内定义实现,保存在后缀为.cs的文件中,C#没有头文件。工程中定义的所有类,都默认在同一名字空间中,一个类可以直接使用同一工程中定义的任意一个类。 null*null*null*null*null*null*1.8 定义对象格式:
类名 对象名 = new 类名( … ) ;Time t1 = new Time ( 12, 10, 10 );返回一个引用,并不是返回指针C#中没有指针概念,
C#是一种安全的语言12
10
10t1Time t2 = t1;
t2.SetTime ( 0, 0, 0);t1 = new Time ( 21, 0, 0 );21
0
00
0
0自定义类都是引用类型null*如何访问或改变对象的属性(成员变量)?class Time
{
public int hour;
public int minute;
public int second;
……
}Time t1=new Time(12,0,0);
t1.hour = 100;无法保证成员变量赋值的合法性null*1.9 类的属性class Time
{
private int hour;
private int minute;
private int second;
public int getHour()
{
return hour;
}
public void setHour( int v )
{
if ((v>=0)&&(v<24))
hour = v;
else
hour = 0;
}
……
}优点:防止设置非法值;
缺点:每个变量都需要记忆两个函数,访问和设置属性的方式繁琐既保证赋值的合法性,又
可以直接访问和赋值呢?null*属性:是一种类的成员,用来控制其他对象对本对象成员变量的直接访问。格式:
public 数据类型 属性名 {
get {
//获得成员变量代码,例如:
//return 成员变量;
}
set {
//设置成员变量代码
//通过隐式参数value设置
}
}数据类型和属性名与相应的成员变量对应对应每个可直接访问的成员变量,可定义一个属性。get访问器
set访问器null*class Time
{
private int hour;
public int Hour {
get {
return hour;
}
set {
if ((value>=0)&&(value<24))
hour = value;
else
hour = 0;
}
}
……
}属性类型必须和相应成员变量类型一致习惯约定:将成员变量名的首字母改为大写作为属性名Time t1 = new Time(10,10,0);
t1.Hour = 12;
Console.WriteLine(“The hour is {0} . ”, t1.Hour );提示:
只读属性:只提供get
只写属性:只提供setnull*1.10 多态性和抽象类C#的多态性定义与C++类似public class Animal {
public virtual void Eat ( )
{
Console.WriteLine (“Eat something”);
}
……
}public class Cat : Animal {
public override void Eat ( )
{
Console.WriteLine (“Eat small animals”);
}
……
}重载基类虚函数时,必须用override关键字null*C#中抽象方法相当于C++中的纯虚函数概念,包含抽象方法的类为抽象类,抽象类不能直接实例化(定义对象)public abstract class Animal {
public abstract void Eat ( );
……
}public class Cat : Animal {
public override void Eat ( )
{
Console.WriteLine (“Eat small animals”);
}
……
}抽象类、抽象方法前必须有关键字:abstract,抽象方法必须为空派生类继承抽象类时,必须重载实现其所有的抽象方法null*定义一个类UpperCase,要求:
用C#语言实现;
该类实例表示的字符串中不包含小写字符,遇到小写字符时,将自动转变为 大写字符,其它字符不变。例如:
UpperCase str1=new UpperCase(“Hello world!”);
// HELLO WORLD!
能够进行赋值、+=等操作:
str1 += “ No 25”;
UpperCase str2=str1;
UpperCase str3=new UpperCase();
str3+=str1;
能够利用属性直接取得其表示的字符串;
请在另一个类的Main函数中测试改类。作业:(提交截至日期5.9日)