C#学习笔记(C#与C++的差异)001
由于本人有很好的C++基础,所以想从C++直接转到C#.
1. 布尔值:在C++中,bool类型实质上是一个整数。在C#中,不存在bool类型与其他类型之间的相互转换。
bool 关键字是System.Boolean的别名.它用于声明变量来存储布尔值true和false.
可将布尔值赋给bool变量.也可以将计算为bool类型的表达式赋给bool变量.
在C++中,bool类型的值可转换为int类型的值;也就是说,false等效于零值,而true等效于非零值.在C#中,不存在bool类型与其它类型之间的相互转换.例如,下列if语句在C#中是非法的,而在C++中则是合法的:
int x = 123;
if (x) // 在C# 是错误的
{ printf("The value of x is nonzero."); }
若要测试int类型的变量,必须将该变量与一个值(比如零)进行显式比较,如下所示:
int x = 123;
if (x != 0) // 在C# 中容许
{ printf(“The value of x is nonzero.”); }
2. long类型:long类型在C#中为64位,而在C++中为32位。
long关键字表示一种整形,该类型根据下表显示的大小和范围存储值。
long取值范围-9223372036854775808到9223372036854775807,在long类型中使用后缀L:
long long2 =
当使用后缀L时,将根据整数的大小确定它的类型为long还是ulong。
3. switch语句:与C++中的switch语句不同,C#不支持从一个case标签贯穿到另一个case标签。
switch语句是一个控制语句,它通过将控制传递给其体内的一个case语句来处理多个选择和枚举。
空case标签可以从一个case标签贯穿到另一个:
using System;
class SwitchTest
{
static void
{
int n = 2;
switch(n)
{
case 1:
case 2:
case 3:
Console.WriteLine(“It`s 1, 2, or 3.”);
break;
default:
Console.WriteLine(“Not sure what it is.”);
break;
}
}
}
OUT: It`s 1, 2, or 3.
4. 委托:C#中的委托大致类似于C++中的函数指针,是类型安全可靠的.
委托类型声明的格式如下:
public delegate void TestDelegate(string message);
delegate关键用于声明一个引用类型,该引用类型可用于封装命名方法或匿名方法.委托类似于C++中的函数指针;但是,委托是类型安全和可靠的.
5. extern关键字:在C++中,extern用于导入类型。在C#中,extern用于为使用同一程序集的不同版本创建别名。
extern修饰符用于声明在外部实现的方法。extern修饰符的觉用法是在使用Interop服务调入非托管代码DllImport属性一起使用;在这种情况下,该方法还必须声明为static,如下面的所示:
[DllImport(“avifil32.dll”)]
private static extern void AVIFileInit();
将abstract和extern修饰符一起使用来修改同一成员是错误的。使用extern修饰符意味着方法在C#代码的外部实现,而使用abstract外包符意思着在类在未提供方法实现。
6. static关键字:在C++中,static既可用于声明类级实体,也可用于声明特定于某模块的类型。在C#中,static仅用于声明类级实体。
使用static修饰符声明属于类型本身而不是属于特定对象的静态成员。static修饰符可用于类、字段、方法属性、运算符、事件和构造函数,但不能用于索引器、析构函数或类以外的类型。
备注:
l 常数或者类型声明隐式地静态成员。
l 不能通过实例引用静态成员。然而,可以通过类型名称引用它。
l 尽管类的实例包含该类所有实例字段的单独副本,但每个静态字段只有一个副本。
l 不可以使用this来引用静态方法或属性访问器。
l 如果对类应用static关键字,则该类的所有成员都必须是静态的。
l 类(包括静态类)可以有静态构造函数。在程序开始和实例化类之间的某个时刻调用静态构造函数。
7. C#中的Main方法和C++中的main函数的声明方式不同。在C#中,它是大写的,并且始终是static的。此外,在C#中,对处理命令行参数的支持要可靠得多。
Main方法是程序的入口点,您将在那里创建对象和调用其他方法。一个C#程序中只能有一个入口点。
class TestClass
{
static void
{
// Display the number of command line arguments:
System.Console.WriteLine(args.Length);
}
}
概述:
l Main方法是程序的入口点,程序控制在该方法中开始和结束。
l 该方法在类或结构的内部声明。它必须为静态方法,而不应该为公共方法。
l 它可以具有void或int返回类型。
l 声明Main方法时既可以使用参数,也可以不使用参数。
l 参数可以作为从零开始索引的命令行参数来读取。
l 与C和C++不同,程序的名称不会被当作第一个命令参数。
8. 在C#中,只有在unsafe模式下才允许使用指针。
unsafe关键字表示不安全上下文,该上下文是任何涉及指针的操作所必需的。
可以在类型或成员的声明中使用unsafe修饰符。因此,类型或成员的整个正文范围均被视为不安全上下文。若要编译不安全代码,必须指定/unsafe编译器选项。无法通过公共语言运行库验证不安全代码。
9. foreach关键字使您可以循环访问数组和集合。
foreach语句为数组或对象集合中的每个元素重复一个嵌入语句级。foreach语句用于循环访问集合以获取所需信息,但不应用于更改集合内容以避免产生不可预知的副作用。
备注:
嵌入语句为数组或集合中的每个元素继续执行。当为集合中的所有元素完成有迭代后,控制传递给foreach块之后的下一个语句。
在此示例中,使用foreach显示整数数组的内容。
// cs_foreach.cs
class ForEachTest
{
static void
{
int[] fibarray = new int[] {0, 1, 2, 3, 5, 6, 18};
foreach(int i in fibarray)
{
System.Console.WriteLine(i);
}
}
}
输出
0 1 2 3 5 6 18
10. 方法隐藏:C++通过继承支持方法的隐式“隐藏”。在C#中,必须使用new修饰符来显式隐藏继承的成员。
在C#中,new关键字可用作运算符、修饰符或约束。
l new运算符:用于创建对象和调用构造函数。
new运算符还用于调用值类型的默认构造函数。
不能重载new运算符。如果new运算符分配内在失败,将引发异常OutOfMemoryException。
l new修饰符:用于向基类成员隐藏继承成员。
在用作修饰符时,new关键字可以显式隐藏从基类继承的成员。隐藏继承的成员意味着该成员的派生版本将替换基类版本。在不使用new修饰符的情况下隐藏成员是允许的,但会生成警告。使用new显式隐藏成员会取消此警告,并记录代之派生版本这一事实。
若要隐藏继承的成员,请使用相同名称在派生类中声明该成员,并使用new修饰符该成员。例如:
public class BaseC
{
public int x;
public void invoke(){}
}
public class DerivedC : BaseC
{
new public void Invoke(){}
}
在此示例中,DerivedC.Invoke隐藏了BaseC.Invoke。字段x不受影响,因为它没有被类似的名称的字段隐藏。
通过继承隐藏名称采用下列形式之一:
1. 引入类或结构中的常数、指定、属性或类型隐藏具有相同名称的所有基类成员。
2. 引入类或结构中的索引器将隐藏具有相同名称的所有基类索引器。
3. 引入类或结构的方法隐藏基类中具有相同名称的属性、字段和类型。同时也隐藏具有相同签名的所有基类方法。
对同一成员同时使用new和override是错误的,因为这两个修饰符在含义上相互排斥。使用new会用同样的名称创建一个新成员并使原始成员变为隐藏的,而override则扩展继承成员的实现。
l new约束:用于在泛型声明中约束可能用作类型参数的参数的类型。
new结束指定泛型类声明中的任何类型参数都必须有公共的无参数构造函数。当泛型创建类型的新实例时,将此约束应用于类型参数,如下面的示例所示:
class ItemFactory<T> where T: new()
{
public T GetNewItem()
{
return new T();
}
}
当与其他约束一起使用时,new()约束必须最后指定:
using System;
public class ItemFactory<T>
where T: IComparable, new()
{}