- C#是托管的,运行在CLR之上,这是最重要的,虽然写程序的时候感觉不是那么明显
- Main函数
using System;
using System.Collections.Generic;
using System.Text;
using System.Collections.Generic;
using System.Text;
namespace HelloCS
{
class Program
{
static void Main(string[] args)
{
}
}
}
{
class Program
{
static void Main(string[] args)
{
}
}
}
Main
函数必须是类或者结构的
static
成员
可以返回 void 或者 int
参数是 string 的数组,不包含可执行文件名
可以没有参数
可以返回 void 或者 int
参数是 string 的数组,不包含可执行文件名
可以没有参数
- Value Type & Reference Type
Value Type
Simple Type
结构
枚举
Simple Type
结构
枚举
Reference Type
Class ( 从 Object 集成 )
Inerface
delegate
Class ( 从 Object 集成 )
Inerface
delegate
Local variable MUST initialize
int i ;
直接使用的话 编译错误 @-@
int i ;
直接使用的话 编译错误 @-@
int i
;
i= 0 ;或者 i= new int();
//use i OK
i= 0 ;或者 i= new int();
//use i OK
- 数组
定义方式:
Type[] arrayName
int[] array1 = new int[5];
- 属性
Class Time{
private double seconds;
public double Hours
{
get { return seconds/3600;}
set { seconds = value *3600; }
}
}
Indexer
Class SampleCollection<T>
{
private T arr = new T[100];
public T this [int i]
{
get{ return arr[i]; }
set{ arr[i] = value}
}
}
以公有的方式取得,设定数值,隐藏实现和验证
set,get 的访问级别可以不同
Value 关键字提供给 Set
没有实现 Set 的属性只读
set,get 的访问级别可以不同
Value 关键字提供给 Set
没有实现 Set 的属性只读
- Indexer
Class SampleCollection<T>
{
private T arr = new T[100];
public T this [int i]
{
get{ return arr[i]; }
set{ arr[i] = value}
}
}
{
private T arr = new T[100];
public T this [int i]
{
get{ return arr[i]; }
set{ arr[i] = value}
}
}
SampleCollection<string> strArr =
new SampleCollection<string>();
strArr[0] = “ hello world”;
new SampleCollection<string>();
strArr[0] = “ hello world”;
使一个类能够像数组一样被访问
this , value 关键字的使用
index 不一定是 int 的,可以定义自己的查找方法
可以包含多于一个参数,例如: 2 维数组
this , value 关键字的使用
index 不一定是 int 的,可以定义自己的查找方法
可以包含多于一个参数,例如: 2 维数组
- 委托(Delegate)
委托是
Type
(一个方法的引用)
C++ 的函数指针相似,但是 type safe
可以使方法作为参数传递(回调)
函数指针只能用来引用静态函数,但代理既能够引用静态方法,也能够引用实例方法。
C++ 的函数指针相似,但是 type safe
可以使方法作为参数传递(回调)
函数指针只能用来引用静态函数,但代理既能够引用静态方法,也能够引用实例方法。
- 事件(Event)
public delegate void ButtonEventHandler
class testButton
{
public event ButtonEventHandler OnClick;
public void Click()
{
….
OnClick();
}
}
_______________________________________________
testButton mb = new testButton();
mb.OnClick + = new ButtonEventHandler(TestHandler);
mb.Click();
{
public event ButtonEventHandler OnClick;
public void Click()
{
….
OnClick();
}
}
_______________________________________________
testButton mb = new testButton();
mb.OnClick + = new ButtonEventHandler(TestHandler);
mb.Click();
- Struct 和 Class
结构(
Struct
)与类很相似。然而,类是作为一种引用类型在堆中创建,而结构是一种值类型,它存储在栈中或者是嵌入式的。因此,只要谨慎运用,结构要比类快。结构可以实现接口,可以象类一样拥有成员,但结构不支持继承。然而,简单地用结构来取代类可能导致惨重损失。这是因为,结构是以值的方式传递,由于这种传递方式要把值复制到新的位置,所以传递一个
“
肥胖的
”
结构需要较大的开销。而对于类,传递的时候只需传递它的引用
- Partial class
允许一个类,结构,接口被定义在多个文件中
例如:一个 CS 文件和一个 XAML 文件
例如:一个 CS 文件和一个 XAML 文件
- ref,out关键字
函数定义
void ProcessNumber(ref int j) { j = 16; }
函数使用:
int i = 8;
ProcessNumber(ref i);
void ProcessNumber(ref int j) { j = 16; }
函数使用:
int i = 8;
ProcessNumber(ref i);
- unsafe 关键字
C# 提供了支持 “ 不安全 ” ( unsafe )代码的能力,这种代码能够直接操作指针,能够 “ 固定 ” 对象以便临时地阻止垃圾收集器移动对象。无论从开发者还是用户的眼光来看,这种对 “ 不安全 ” 代码的支持其实是一种安全功能。 “ 不安全 ” 的代码必须用 unsafe 关键词显式地标明,因此开发者不可能在无意之中使用 “ 不安全 ” 的代码。同时, C# 编译器又和执行引擎协作,保证了 “ 不安全 ” 的代码不能伪装成为安全代码。
- Boxing 和Unboxing
在
C#
以及
.NET
运行时环境中,这个
“
通信
”
问题通过包装(
Boxing
)和解除包装(
Unboxing
)解决。包装是一种让值类型看起来象引用类型的处理过程。当一个值类型(简单数据类型)被用于一个要求或者可以使用对象的场合时,包装操作自动进行。包装一个
value-type
值的步骤包括:分配一个对象实例,然后把
value-type
值复制到对象实例。解除包装所执行的动作与包装相反,它把一个引用类型转换成值类型。解除包装操作的步骤包括:首先检查并确认对象实例确实是给定
value-type
的一个经过包装的值,然后从对象实例复制出值。
- 可访问性
类的每个成员都有特定类型的可访问性。
C#
有
5
种类型的可访问性,如下所示:
public :成员可以从任何代码访问。
protected :成员只能从派生类访问。
internal :成员只能从同一程序集的内部访问。
protected internal :成员只能从同一程序集内的派生类访问。
private :成员只能在当前类的内部访问。
public :成员可以从任何代码访问。
protected :成员只能从派生类访问。
internal :成员只能从同一程序集的内部访问。
protected internal :成员只能从同一程序集内的派生类访问。
private :成员只能在当前类的内部访问。
- sealed关键词
如果想要某个类不再被派生,使用
sealed
( 范型 )Generics
不是 C# 特有的, C++ 也支持
C#2.0 中支持的新特性
( 范型 )Generics
不是 C# 特有的, C++ 也支持
C#2.0 中支持的新特性
- is和as操作符
using System; interface IShape
{ void draw(); }
public class Rectangle: IShape
{ public void draw() { }
public int GetWidth() { return 6; }
}
public class Circle: IShape {
public void draw() { } public int GetRadius() { return 5; }
}
}
is
和
as
操作符
is 和 as 操作符
Override 关键字
扩展一个抽象( abstract )的或者虚的( virrual )实现的时候使用
可以用来修饰发方法,属性, indexer 或者 event
用 override 修饰的,必须和基类的 signature 相同
不能 override 一个 non-virtual 或者 static
不能修改访问级别( access level )
如果没有提供 override , C# 编译器认为 new (有警告)
New 关键字给派生类提供一个新的方法。 Hide 基类的方法
is 和 as 操作符
Override 关键字
扩展一个抽象( abstract )的或者虚的( virrual )实现的时候使用
可以用来修饰发方法,属性, indexer 或者 event
用 override 修饰的,必须和基类的 signature 相同
不能 override 一个 non-virtual 或者 static
不能修改访问级别( access level )
如果没有提供 override , C# 编译器认为 new (有警告)
New 关键字给派生类提供一个新的方法。 Hide 基类的方法
- Override关键字
class Class1
{
public virtual void aaa()
{
return;
}
}
class Class2:Class1
{
public override void aaa()
{
return;
}
{
public virtual void aaa()
{
return;
}
}
class Class2:Class1
{
public override void aaa()
{
return;
}
class Class1
{
public virtual void aaa()
{
return;
}
}
class Class2:Class1
{
public void aaa()
{
return;
}
{
public virtual void aaa()
{
return;
}
}
class Class2:Class1
{
public void aaa()
{
return;
}
Class1 ra = new Class2();
ra.aaa()
ra.aaa()
override
提供了更好的安全性
- 名字空间(namespace)
C++
也支持,但是使用的没有
C#
这么普遍
我们自己写代码时也应该使用
我们自己写代码时也应该使用
- 其他
应用程序域(
Application Domains
)
程序集和全局程序集缓存( Assembilies and the Global Assembly cache )
线程
性能
反射( Reflection )
DLL
安全( Security )
C#3.0
程序集和全局程序集缓存( Assembilies and the Global Assembly cache )
线程
性能
反射( Reflection )
DLL
安全( Security )
C#3.0