c# vs c++

1、在 C++ 中,类和结构实际上是相同的,而在 C# 中,它们很不一样。C# 类可以实现任意数量的接口,但只能从一个基类继承。而且,C# Struct不支持继承,也不支持显式默认构造函数(必须提供参数化构造函数)。

  1)It is an error to define a default (parameterless) constructor for a struct. It is also an error to initialize an instance field in a struct body. You can initialize struct members only by using a parameterized constructor or by accessing the members individually after the struct is declared. Any private or otherwise inaccessible members can be initialized only in a constructor.

  2) A struct cannot inherit from another struct or class, and it cannot be the base of a class. A struct can implement interfaces, and it does that exactly as classes do.

  3)A struct is a value type, while a class is a reference type

  4)When you create a struct object using the new operator, it gets created and the appropriate constructor is called. Unlike classes, structs can be instantiated without using the new operator. In such a case, there is no constructor call, which makes the allocation more efficient. However, the fields will remain unassigned and the object cannot be used until all of the fields are initialized.

  5)下述代码,把struct换成class会导致编译错误

public struct CoOrds
{
public int x, y; public CoOrds(int p1, int p2)
{
x = p1;
y = p2;
}
}
// Declare a struct object without "new."
class TestCoOrdsNoNew
{
static void Main()
{
// Declare an object:
CoOrds coords1; // Initialize:
coords1.x = ;
coords1.y = ; // Display results:
Console.Write("CoOrds 1: ");
Console.WriteLine("x = {0}, y = {1}", coords1.x, coords1.y); // Keep the console window open in debug mode.
Console.WriteLine("Press any key to exit.");
Console.ReadKey();
}
}
// Output: CoOrds 1: x = 10, y = 20

  6)在栈上定义数组,则只能像如下这样,没有C++方便。

 public struct CoOrds
{
public int x, y;
public CoOrds(int p1, int p2)
{
x = p1;
y = p2;
}
} // Declare a struct object without "new."
class TestCoOrdsNoNew
{
static void Main()
{
// Declare an object:
CoOrds coords1; // Initialize:
coords1.x = ;
coords1.y = ; // Display results:
System.Console.Write("CoOrds 1: ");
System.Console.WriteLine("x = {0}, y = {1}", coords1.x, coords1.y);
}
}

2、在 C++ 中,数组只是一个指针。在 C# 中,数组是包含方法和属性的对象。例如,可通过 Length 属性查询数组的大小。C# 数组还使用索引器(验证用于访问数组的各个索引)。声明 C# 数组的语法不同于声明 C++ 数组的语法:在 C# 中,“[]”标记出现在数组类型之后,而非变量之后。

  1)数组类型是从抽象基类型 Array 派生的引用类型。由于此类型实现了 IEnumerable 和 IEnumerable<T>,因此可以对 C# 中的所有数组使用 foreach 迭代。

  2)索引器。this 关键字用于定义索引器。索引器可被重载。value 关键字用于定义由 set 索引器分配的值。

 class SampleCollection<T>
{
private T[] arr = new T[];
public T this[int i]
{
get
{
return arr[i];
}
set
{
arr[i] = value;
}
}
} // This class shows how client code uses the indexer
class Program
{
static void Main(string[] args)
{
SampleCollection<string> stringCollection = new SampleCollection<string>();
stringCollection[] = "Hello, World";
System.Console.WriteLine(stringCollection[]);
}
}

3、在 C++ 中,bool 类型实质上是一个整数。在 C# 中,不存在 bool 类型与其他类型之间的相互转换。

  1)bool 关键字是 System.Boolean 的别名。它用于声明变量来存储布尔值 true 和 false

4、long 类型在 C# 中为 64 位,而在 C++ 中为 32 位。

5、在 C++ 中,除非显式通过指针或引用传递,否则所有变量都通过值传递。在 C# 中,除非显式通过具有 ref 或 out 参数修饰符的引用传递,否则类通过引用传递,而结构通过值传递。

6、与 C++ 中的 switch 语句不同,C# 不支持从一个 case 标签贯穿到另一个 case 标签。

7、base 关键字用于从派生类中访问基类的成员。基类访问只能在构造函数、实例方法或实例属性访问器中进行。 从静态方法中使用 base 关键字是错误的。

public class Person
{
protected string ssn = "444-55-6666";
protected string name = "John L. Malgraine"; public virtual void GetInfo()
{
Console.WriteLine("Name: {0}", name);
Console.WriteLine("SSN: {0}", ssn);
}
}
class Employee : Person
{
public string id = "ABC567EFG";
public override void GetInfo()
{
// Calling the base class GetInfo method:
base.GetInfo();
Console.WriteLine("Employee ID: {0}", id);
}
} class TestClass
{
static void Main()
{
Employee E = new Employee();
E.GetInfo();
}
}
/*
Output
Name: John L. Malgraine
SSN: 444-55-6666
Employee ID: ABC567EFG
*/

8、C++ 通过继承支持方法的隐式“隐藏”。在 C# 中,必须使用 new 修饰符来显式隐藏继承的成员。

9、预处理器指令用于条件编译。C# 中不使用头文件。

10、static const不能同时使用,因为在一个类,const变量实际上就是一个static变量。

11、在 C# 中,只有在 unsafe 模式下才允许使用指针。

12、在 C++ 中,字符串只是字符的数组。在 C# 中,字符串是支持可靠搜索方法的对象。

13、在 C++ 中,多个模块公用的类型放置在头文件中。在 C# 中,可通过元数据获取此信息。

14、C# 中的局部变量在初始化前不能使用。

15、C# 不支持位域。

参考:

1、http://msdn.microsoft.com/zh-cn/library/8b0bdca4(v=vs.90).aspx

2、http://msdn.microsoft.com/zh-cn/library/6x16t2tx(v=vs.90).aspx

3、http://msdn.microsoft.com/zh-cn/library/yyaad03b(v=vs.90).aspx

随机推荐

  1. 服务器上通过FTP共享文件夹

    近日,公司某服务器共同操作的人员增多,而我只需访问及替换某些文件,故想到共享文件夹. 在IIS中建立ftp站点,添加虚拟目录(可多个,对应不同文件夹),设置允许访问的用户(添加用户,见在IIS上搭建F ...

  2. minio 介绍

      minio 兼容Amason的S3分布式对象存储项目,采用Golang实现,客户端支持Java,Python,Javacript, Golang语言. Minio可以做为云存储的解决方案用来保存海 ...

  3. WINDOWS下kill进程的命令

    相信大家都有用命令行(CMD)解决问题的习惯,起码我感觉自己在处理Windows系统故障时越来越离不开Windows PE了,今天我想介绍两个很实用的命令:Tasklist与Tskill.命令:Tas ...

  4. c# String.Split数组省去空字符

    public static void test() { string txt = "hi[#b1.jpg][#b4.jpg]few[#b1-3.jpg]"; txt = " ...

  5. docker-tomcat

    https://yq.aliyun.com/articles/6894 1,add命令源目录 只能从 ./ 当前目录开始,目标目录是容器的目录,不是服务器的目录 2,server.xml改的东西,里面 ...

  6. WaitHandle学习笔记

    信号量与互斥体 互斥体(Mutex)是操作系统中一种独占访问共享资源的机制.它像一把所锁,哪个线程获取到互斥体的控制权,则可以访问共享的资源,或者执行处于受保护的代码.而其他的线程如果也想获取控制权, ...

  7. redis+php实现微博功能(一)

    (一).微博功能概况 微博用户账号注册 微博用户登录 微博发布 添加微博好友(粉丝) 微博推送 微博冷数据写入mysql数据库 (二).redis数据结构设计 这节分享微博用户注册与登录:我们完全采用 ...

  8. CentOS(五)--Linux系统的分区概念

    一.系统分区 首先先普及一下有关系统分区的一些知识: 硬盘分区有三种,主磁盘分区.扩展磁盘分区.逻辑分区. 一个硬盘主分区至少有1个,最多4个,扩展分区可以没有,最多1个.且主分区+扩展分区总共不能超 ...

  9. 安装ecb

    mac emacs上安装ecb,通过elpa折腾得要死,死活无法使用. 解决办法:下载https://github.com/alexott/ecb,添加路径,(require 'ecb),直接ok.

  10. Form 总结

    禁止input自动完成下拉 //ie: autocomplete="off" //ff: disableautocomplete <input size="40&q ...