C# 中没有全局变量或全局函数,取而代之的是通过静态函数和静态变量完成的。 和 C++ 要求用户显示创建 delete 运算符不一样,它们使用新运算符创建,且没有 delete 运算符。 在 C# 中它们自动由垃圾回收系统回收。
C# 提供了一种更加便捷、简单而又直接的属性访问方式。
所以上面的类应该写成这样:
代码:
using System;
class Date
{
public int Day{
get {
return day;
}
set {
day = value;
}
}
int day;
public int Month{
get {
return month;
}
set {
month = value;
}
}
int month;
public int Year{
get {
return year;
}
set {
year = value;
}
}
int year;
public bool IsLeapYear(int year)
{
return year%4== 0 ? true: false;
}
public void SetDate (int day, int month, int year)
{
this.day = day;
this.month = month;
this.year = year;
}
}
这里是你 get 和 set 属性的方法:
代码:
class User
{
public static void Main()
{
Date date = new Date();
date.Day = 27;
date.Month = 6;
date.Year = 2003;
Console.WriteLine
(“Date: {0}/{1}/{2}”, date.Day, date.Month, date.Year);
}
}
修饰符
你必须知道 C++ 中常用的 public、private 和 protected 修饰符。
我将在这里讨论一些 C# 引入的新的修饰符。
readonly
readonly 修饰符仅用于修饰类的数据成员。
正如其名
字说的,一旦它们已经进行了写操作、直接初始化或在构造函数中对其进行了赋值,
readonly 数据成员就只能对其进行读取。
readonly 和 const 数据成员不同之处在于 const 要求你在声明时进行直接初始化。
看下面的例程:
代码:
class MyClass
{
const int constInt = 100; //直接进行
readonly int myInt = 5; //直接进行
readonly int myInt2;
public MyClass()
{
myInt2 = 8; //间接进行
}
public Func()
{
myInt = 7; //非法
Console.WriteLine(myInt2.ToString());
}
}
sealed
带有 sealed 修饰符的类不允许你从它继承任何类。所以如果你不想一个类被继承,
你可以对该类使用 sealed 关键字。
代码:
sealed class CanNotbeTheParent
{
int a = 5;
}
unsafe
你可以使用 unsafe 修饰符在 C# 中定义一个不安全上下文。
在不安全上下文中,你可以插入不安全代码,如 C++ 的指针等。参见以下代码:
代码:
public unsafe MyFunction( int pInt, double pDouble)
{
int* pAnotherInt = new int;
*pAnotherInt = 10;
pInt = pAnotherInt;
…
*pDouble = 8.9;
}
接口
如果你有 COM 的思想,你马上就知道我在说什么了。接口是只包含函数签名而在子类中实现的抽象基类。
在 C# 中,你可以用 interface 关键字声明这样的接口类。
.NET 就是基于这样的接口的。
C# 中你不能对类进行多重继承——这在 C++ 中是允许的。
通过接口,多重继承的精髓得以实现。即你的子类可以实现多重接口。(译注:由此可以实现多重继承)
代码:
using System;
interface myDrawing
{
int originx
{
get;
set;
}
int originy
{
get;
set;
}
void Draw(object shape);
}
class Shape: myDrawing
{
int OriX;
int OriY;
public int originx
{
get{
return OriX;
}
set{
OriX = value;
}
}
public int originy
{
get{
return OriY;
}
set{
OriY = value;
}
}
public void Draw(object shape)
{
… // 做要做的事
}
// 类自身的方法
public void MoveShape(int newX, int newY)
{
…..
}
}
(类似于引用的传递方法)http://www.cnblogs.com/gsk99/archive/2010/12/13/1904557.html
拆箱和装箱:int i=1 //声明一个值类型的变量 object o=i; //装箱,在堆上开辟一块内存,复制i的值到此内存块,公布一个地址,o引用它,o则为已装箱值类型(引用类型),会发生内存复制的操作。 int b=(int)o; //拆箱,通过o查找到托管堆上的内存快,提领这个内存快中值的地址,然后然后给b赋值,,事实上在给b赋值这一步不能算拆箱的一步,所以拆箱比装箱廉价得多
待于解决:
组在 C# 中比 C++ 中要高级很多。数组分配于堆中,所以是引用类型的。