当前位置:七道奇文章资讯编程技术VC/C++编程
日期:2011-03-22 13:55:00  来源:本站整理

C++编程人员简单犯的10个C#错误[VC/C++编程]

赞助商链接



  本文“C++编程人员简单犯的10个C#错误[VC/C++编程]”是由七道奇为您精心收集,来源于网络转载,文章版权归文章作者所有,本站不对其观点以及内容做任何评价,请读者自行判断,以下是其具体内容:

我们知道,C#的语法与C++非常类似,实现从C++向C#的改变,其艰难不在于语言本身,而在于熟习.NET的可管理环境和对.NET框架的理解.固然C#与C++在语法上的改变是很小的,几近不会对我们有什么影响,但有些改变却足以使一些粗心的C++编程人员时刻铭刻在心.在本篇文章中我们将谈论C++编程人员最简单犯的十个错误.

陷阱1: 没有明确的完毕办法

几近可以完好必定地说,关于大大都C++编程人员而言,C#与C++最大的差别之处就在于碎片汇集.这也意味着编程人员再也无需耽忧内存泄露和确保删除全部没有效的指针.但我们再也无法切确地掌握杀死无用的对象这个历程.事实上,在C#中没有明确的destructor.

假如利用非可管理性资源,在不利用这些资源后,必须明确地释放它.对资源的隐性掌握是由Finalize办法(也被称为finalizer)供应的,当对象被销毁时,它就会被碎片汇集程序调用收回对象所占用的资源.finalizer应当只释放被销毁对象占用的非可管理性资源,而不该牵扯到其他对象.假如在程序中只利用了可管理性资源,那就无需也不该当履行Finalize办法,只有在非可管理性资源的处理中才会用到Finalize办法.由于finalizer需求占用一定的资源,因此该当只在需求它的办法中履行finalizer.直接调用一个对象的Finalize办法是绝对不答应的(除非是在子类的Finalize中调用底子类的Finalize.),碎片汇集程序会自动地调用Finalize.

从语法上看,C#中的destructor与C++非常类似,但其实它们是完好差别的.C#中的destructor只是定义Finalize办法的捷径.因此,下面的二段代码是有辨别的:

  ~MyClass()
{ // 需求完成的任务
}
   MyClass.Finalize() {// 需求完成的任务
base.Finalize();
}

错误2:Finalize和Dispose利用谁?

从上面的阐述中我们已经很清楚,显性地调用finalizer是不答应的,它只能被碎片汇集程序调用.假如但愿尽快地释放一些不再利用的数目有限的非可管理性资源(如文件句柄),则应当利用IDisposable界面,这一界面有个Dispose办法,它可以帮你完成这个任务.Dispose是无需等候Finalize被调用而可以释放非可管理性资源的办法.

假如已经利用了Dispose办法,则该当禁止碎片汇集程序再对呼应的对象履行Finalize办法.为此,需求调用静态办法GC.SuppressFinalize,并将呼应对象的指针传送给它作为参数,Finalize办法就可以调用Dispose办法了.据此,我们可以得到以下的代码:

public void Dispose()
{
// 完成清理操作
// 告诉GC不要再调用Finalize办法
GC.SuppressFinalize(this);
}
public override void Finalize() {
Dispose(); base.Finalize();
}

关于有些对象,大概调用Close办法就更符合(比方,关于文件对象调用Close就比Dispose更符合),可以通过成立一个private属性的Dispose办法和public属性的Close办法,并让Close调用Dispose来实现对某些对象调用Close办法.

由于不能肯定一定会调用Dispose,并且finalizer的履行也是不肯定的(我们无法掌握GC会在什么时刻运行),C#供应了一个Using语句来保证Dispose办法会在尽大概早的时间被调用.普通的办法是定义利用哪个对象,然后用括号为这些对象指定一个活动的范围,当碰到最内层的括号时,Dispose办法就会被自动调用,对该对象举行处理.

using System.Drawing;
class Tester
{
public static void Main()
{
using (Font theFont = new Font("Arial", 10.0f))
{
//利用theFont对象
} // 编译器将调用Dispose处理theFont对象
Font anotherFont = new Font("Courier",12.0f);
using (anotherFont)
{
// 利用anotherFont对象
} // 编译器将调用Dispose处理anotherFont对象 }
}

  以上是“C++编程人员简单犯的10个C#错误[VC/C++编程]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:
  • <b>高质量C++/C编程指南-第7章-内存管理(6)</b>
  • 高质量C++/C编程指南-第7章-内存管理(7)
  • 高质量C++/C编程指南-第8章-C++函数的高级特点(1)
  • 高质量C++/C编程指南-第8章-C++函数的高级特点(2)
  • 高质量C++/C编程指南-第8章-C++函数的高级特点(3)
  • <b>高质量C++/C编程指南-第8章-C++函数的高级特点(4)</b>
  • <b>高质量C++/C编程指南-第9章-类的构造函数、析构函数与赋值函数(1</b>
  • 高质量C++/C编程指南-第9章-类的构造函数、析构函数与赋值函数(2
  • 高质量C++/C编程指南-第9章-类的构造函数、析构函数与赋值函数(3
  • 高质量C++/C编程指南-第9章-类的构造函数、析构函数与赋值函数(4
  • <b>高质量C++/C编程指南-第10章-类的担当与组合(1)</b>
  • 高质量C++/C编程指南-第10章-类的担当与组合(2)
  • 本文地址: 与您的QQ/BBS好友分享!
    • 好的评价 如果您觉得此文章好,就请您
        0%(0)
    • 差的评价 如果您觉得此文章差,就请您
        0%(0)

    文章评论评论内容只代表网友观点,与本站立场无关!

       评论摘要(共 0 条,得分 0 分,平均 0 分) 查看完整评论
    Copyright © 2020-2021 www.qdodge.com. All Rights Reserved .