【问题标题】:Delphi to .NET + C#德尔福到 .NET + C#
【发布时间】:2008-10-26 08:07:28
【问题描述】:

我已经从事 Delphi (D7) 开发人员很多年了,我一直对 .NET + C# 的东西感到疑惑。我的意思不是“Delphi for .NET”或“Oxygene”技术/插件,而是干净的 .NET/C#。

它与 Delphi 有何不同?还有一些其他问题...

  • Mono/SharpDevelop(我应该知道的其他任何东西?)是否与非免费 Visual Studio 一样强大?
  • 在部署方面,它是如何工作的?程序集 + 框架 + 可执行文件?
  • 框架(3.5 最新?)的工作原理类似于 Java 世界的 JVM,对吗?它是否负责支持/使用多核或 Windows 特定优化等技术?
  • C# 与 Object Pascal 有一些相似之处,应该不会太难适应吧?

谢谢。

【问题讨论】:

    标签: c# .net delphi


    【解决方案1】:

    关于第一点:您是否尝试过(免费)VIsual Studio Express Edition?对于很多事情,这是完全有能力的。您只是没有得到那么多帮助者/设计者,也没有插件支持(用于 IDE 扩展)。

    关于第二个:除了一些nasty tricks,您无法从.NET 创建纯本机可执行文件;它在很大程度上依赖于本地机器上可用的框架。程序集只是 IL 的一个包,可以(通常)包含在 dll 中,或者引导到加载程序集入口点的 exe 中;但在这种情况下,exe 只是一个简单的加载程序加上一个常规程序集。

    其实CLR更像JVM; “框架”实际上只是 BCL 的等价物。主要的 MS 框架+CLR 肯定有一些 Windows 特定的优化,但其他运行时/框架(compactmicroSilverlightMono)会有不同的优化。

    重新多核 - 你有完整的线程支持(自己做) - 但主要的自动多核支持将(希望)在 .NET 4.0 中使用“parallel extensions " 工作。

    关于最后一点:确实应该很熟悉。实际上,如果您想进行一些比较,“reflector”(免费)可以获取已编译的程序集,并向您显示 C# 或 delphi(或其他一些)中的代码。

    [更新问题]

    IL = 中间语言; .NET 不会编译为本机 CPU 指令,而是编译为在运行时成为 CPU 指令的中间内容(逐个方法编译为“即时”(JIT))。这意味着 JIT 编译器可以为本地机器优化相同的 IL。您可以使用NGen 提前完成此操作。

    CLR = 公共语言运行时;本质上是虚拟机

    BCL = 基类库;这组类共享了我的许多应用程序

    重新部署:首先在客户端安装.NET框架;-p

    之后 - 各种选项。在最简单的级别上,您只需将 exe/etc 复制到本地计算机上并运行即可。例如,我使用“robocopy”将代码推送到网络服务器。

    对于复杂客户端应用程序的完整本地安装,可以选择 msi(完整的 VS IDE 将帮助您)。

    对于简单的客户端,您可以使用ClickOnce - 它将应用程序打包成一个签名包,提供自我更新等功能,并允许您声明您需要什么安全性(完全信任等)。 Express Edition 允许您创作 ClickOnce 包。 ClickOnce 甚至可以用于用户无法安装应用程序的锁定客户端,因为该应用程序是隔离的和沙盒的。

    最后,您可以在网络共享之外运行 .NET 应用程序,但存在一些安全隐患:“代码访问安全”层不会给予网络共享“完全信任”(尽管最近对这样可以信任映射的(F:等)共享)。因此,您需要在每个客户端使用 CASPOL 来信任代码。 ClickOnce 会更容易;-p

    【讨论】:

    • 感谢您的信息。关于部署,我不太明白......你能给我举个例子,比如“将应用程序(连接数据库)部署到客户端机器”,通常需要做什么?不好意思问一下,什么是“IL”+“BCL”+“CLR”?
    【解决方案2】:

    作为对 Marc 回答的补充,这些是我从 D6 过渡到 C# 期间的小惊喜:

    • 更好的 OOP,没有全局变量(“var MainForm: TMainForm”等)
    • 一切都是强类型的(通常,您可以没有指针类型)
    • 对于 Windows 窗体,“文本 .dfm 文件”(此处为 YourForm.Designer.cs)实际上是 C# 代码,而不是自定义语言中的资源描述。 (不过,随着 WPF 和 XAML,这种情况发生了巨大变化。)
    • 自定义值类型(“structs”)是可能的(例如,您可以有一个“复杂”类型,其行为就像一个整数或单个,存在于堆栈中)
    • 运算符重载

    还有一些不愉快的小惊喜:

    • 没有类似 Delphi 的类引用(“xxx 类”,例如“type TControlClass: class of TControl”)
    • 没有索引属性(不过,您可以使用嵌套类来伪造它)

    嗯,这就是我现在能想到的,几年后。

    【讨论】:

    • 我会将“界面”添加到令人愉快的惊喜列表中。 Delphis 接口使用起来很糟糕,因为它们需要参考计算。在 C# 中,它们像丝绸一样光滑。
    • Delphi 界面无需引用计数即可工作。当然,因为没有使用 GC,所以接口实现者的生命周期取决于代码。无论如何,我不会将缺少指针或全局变量/函数称为惊喜——它更像是一场噩梦
    • 1.静态成员或多或少是一个全局变量。只是一种不同的语法,但可能导致相同的 OOP 架构问题。 2. Delphi 对指针也有强类型——滥用指针是不好的,我们都同意,但有时它们更快更好。 3. 这是个人意见,取决于您的习惯 - 谁手动编辑 .dfm 内容? 4+5。使用现代版本的 delphi,您可以使用运算符重载来拥有此类自定义值类型。
    【解决方案3】:

    Delphi 是由编写 C# 的同一个人编写的,因此该语言的整体结构不会是最艰难的过渡。您还必须记住,C# 类似于 C,而 Delphi 是 Pascal。 在使用 C# 之后,我尝试查看 Delphi,这是一个非常艰难的过渡。首先没有垃圾收集,其次像@Alan 所说的全局变量很难。您确实有 C# 的继承,但您不需要将 Form 声明为 TForm 等变量。第三,部署是一个巨大的痛苦。使用 .Net 和 GAC,您实际上只需构建您的解决方案,然后就可以了。第四,这是对 Delphi 持续支持的更大担忧。它现在在第三家公司。我认为以相反的方式将 Delphi 转向 C# 会容易得多。

    【讨论】:

    • Delphi 生成的独立可执行文件使用“xcopy 部署”远早于 .NET。大多数软件在没有 GC 的情况下工作。与任何混合 OO 语言(如 C++)一样,使用全局变量取决于您。表单向导创建的全局 TForm 变量只是为了方便。只要知道在销毁时如何释放表单,就可以将其删除。至少您不需要为了存储全局数据而声明虚拟类。
    • 我可以在 dll 之后将 dll 添加到我的软件中,而不必担心使用 .Net。虽然对于一个简单的 exe,这可能毫无价值,但对于我有很多库的复杂软件来说,这是非常有价值的。如果没有 GC,无论是您自己编写的还是代码本身编写的,都会造成内存泄漏,而值绑定形成这不是一个问题。虽然 C++ 是 Java 的主力,C# 的存在是有原因的,但 global 并不是一个聪明的想法,并且在 OOP 中是不必要的。
    • 你确实有 C# 的继承,但你不需要将 Form 声明为 TForm 等的变量。 Delphi 缺乏区分约定让我在阅读 Visual Basic 时很头疼或 C# 我得到了搜索...
    • 使用 Delphi,向软件添加“DLL after DLL”的需求要少得多。即使您只是“xcopy”到一个文件夹,除非您更喜欢专业并使用安装程序。 Java 和 C# 的存在是有原因的,因为有能力聘请无法避免内存泄漏并且可以用指针开火的廉价程序员。全局变量在 OOP 中也是必要的——为什么开发人员实现假类来存储全局数据并实现全局函数?
    • 是的,安装程序的额外成本对于碰巧需要定制软件的每个小型企业来说都是有意义的。 Delphi 并不像您认为的 C# 那样糟糕。它只是 90 年代和 Pascal 孩子的产物。这些事情在 2011 年似乎受到了伤害。
    猜你喜欢
    • 2014-07-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-06
    • 2011-07-02
    相关资源
    最近更新 更多