向C# 高手求助, Delphi.Net 可以做到的为什么C# 却不行呢??? ( 积分: 200 )

  • 主题发起人 主题发起人 lich
  • 开始时间 开始时间
L

lich

Unregistered / Unconfirmed
GUEST, unregistred user!
这里有一段 Delphi.Net 的代码, 谁能将其翻译成 C# 的
主要的目的是要在静态方法中获得类型信息
Type
TClass1 = class(&Object)
public
class function Test01: Integer;
end;

TClass2 = class(TClass1)
public
procedure Hello;
end;

class function TClass1.Test01: Integer;
begin
MessageBox.Show(Self.ClassInfo.FullName);
Result := 1;
end;

procedure TClass2.Hello;
begin

end;

procedure TWinForm.Button1_Click(sender: System.Object;
e: System.EventArgs);
begin
TClass1.Test01;
//Should show "WinForm.TClass1"
TClass2.Test01;
//Should show "WinForm.TClass2"
end;
 
这里有一段 Delphi.Net 的代码, 谁能将其翻译成 C# 的
主要的目的是要在静态方法中获得类型信息
Type
TClass1 = class(&Object)
public
class function Test01: Integer;
end;

TClass2 = class(TClass1)
public
procedure Hello;
end;

class function TClass1.Test01: Integer;
begin
MessageBox.Show(Self.ClassInfo.FullName);
Result := 1;
end;

procedure TClass2.Hello;
begin

end;

procedure TWinForm.Button1_Click(sender: System.Object;
e: System.EventArgs);
begin
TClass1.Test01;
//Should show "WinForm.TClass1"
TClass2.Test01;
//Should show "WinForm.TClass2"
end;
 
前段时间都是看把其他程序的代码转成Delphi的,好是高兴,现在要转其他的,是不是说明Delphi不行了呢,痛苦
 
首先说明我是初学者
在C#中的静态方法中,无法使用this

使用非静态方法可以实现
using System;
using System.Drawing;
using System.Collections;
using System.ComponentModel;
using System.Windows.Forms;
using System.Data;
namespace Project5
{
public class Class1
{
public int Test01()
{
MessageBox.Show(this.ToString() );
return 1;
}
}
public class Class2:Class1
{
public void Hello()
{
}
}
public class WinForm : System.Windows.Forms.Form
{
private System.ComponentModel.Container components = null;
private System.Windows.Forms.Button button1;
public WinForm()
{
InitializeComponent();
}
protected override void Dispose(bool disposing)
{
if (disposing)
{
if (components != null)
{
components.Dispose();
}
}
base.Dispose(disposing);
}
private void InitializeComponent()
{
this.button1 = new System.Windows.Forms.Button();
this.SuspendLayout();
this.button1.Location = new System.Drawing.Point(72, 72);
this.button1.Name = "button1";
this.button1.Size = new System.Drawing.Size(64, 48);
this.button1.TabIndex = 0;
this.button1.Text = "button1";
this.button1.Click += new System.EventHandler(this.button1_Click);
this.AutoScaleBaseSize = new System.Drawing.Size(6, 14);
this.ClientSize = new System.Drawing.Size(292, 273);
this.Controls.Add(this.button1);
this.Name = "WinForm";
this.Text = "WinForm";
this.ResumeLayout(false);
}
[STAThread]
static void Main()
{
Application.Run(new WinForm());
}
private void button1_Click(object sender, System.EventArgs e)
{
Class1 c1=new Class1();
c1.Test01();
Class2 c2=new Class2();
c2.Test01();
}
}
}
 
.NET v1.1中,C#是与CLR完全对应的,而DELPHI.NET时令作了封装的,并且在编译器也作了扩展,对每个类都生成了一个ClassInfo.因此DELPHI.NET的这个功能仅仅是编译器耍的小甜品.而C#中因为不支持宏等,没有办法以优美的形式完成.
类似的代码可以是这样,DELPHI.NET的代码其实就是这么回事(原理)
private void button1_Click(object sender, System.EventArgs e)
{
MessageBox.Show(Class1.get_ClassType().FullName);
MessageBox.Show(Class2.get_ClassType().FullName);
}
class Class1
{
public static Type get_ClassType()
{
return typeof(Class1);
}
}
class Class2 : Class1
{
public static Type get_ClassType()
{
return typeof(Class2);
}
}
也就这样了,不会再有什么更好的形式.C++.NET因为支持宏/模板等,因此可以以相当简洁的形式实现此功能.所以其实你直接调用Type/typeof反而更好(因为C#当中本来就没有DELPHI中的某些特定的概念).
不过.NET v2.0中因为支持了范型,因此有可能有比较好的形式.
 
我的意思是,Delphi看上去简单,但功能却很强大
他会的,别的语言可不一定能做到哦
 
在.NET时代,DELPHI语言本身的亮点已经不多了.像这个功能其实仅仅是一个小花招,不过C#1v.1因为太过直白,实现这个小花招确实不是那么容易.不过从另一个角度说,其实是因为用DELPHI习惯了,在C#中直接使用Type代替TClass其实更直接.如果把C#作为主要开发工具,可能需要改变的是我们的思路.
 
是啊, 实现的思路和开放工具还是密切相关的
不过,萝卜白菜,各有所爱嘛
 
Delphi 用最简单的方法实现了最复杂的问题
记得C++中说,构造函数不可能是虚拟方法
可是,Delphi确偏要这么做,
并且完全没问题,
Delphi的设计者真是天才
 
什么时候才能到精通delphi和c#还有java啊,那样就是一“犇”人了哦。
 
//来自:lich, 时间:2005-9-22 13:39:21, ID:3215036
//Delphi 用最简单的方法实现了最复杂的问题
这个有很多仅仅是语法的小甜品,虽然真的实用.
//记得C++中说,构造函数不可能是虚拟方法
主要是设计理念不同.C++可以通过工厂模式模拟实现虚拟构造函数.而且可以用虚拟函数实现一个初始化函数,这个是完全支持虚拟的,只是需要分开调用.
//来自:gameboyda, 时间:2005-9-22 14:42:31, ID:3215132
什么是精通?又博又专的人确实是天才,而在这些天才眼里,怕是早就没有这些所谓语言的区别了.安德森(C#/DELPHI创造者)算是一个.他对DELPHI/C#没争议,对JAVA自然也是知之甚多.
而对于你我,不要想那么远,别说3个牛了.能有一个笔画就不错了.
 
呵呵,什么叫做语法的小甜品,不懂,
但这个特性可以减少不必要的代码,使程序看上去更简洁
C++的构造函数也未必仅仅是那个函数,编译器在其内部也做了不少的手脚呢,
譬如内存分配
构造函数可以虚拟化,对于设计思想是有很大影响的,
而且大家是不会取直接Call 他的,所以不会有什么问题
如果真的想Call 的化,调用InitInstance 就可以了
虽然,你可以用不同的语言完成同样的功能,
但语言之间的区别也是显而易见的,
你对各种语言都精通之后,才能更准确的评论语言的优劣和特性
但仍然是带有强烈的个人主观色彩
也许,你说语言是没有优劣的,在高手眼里都差不多,
但是我认为,简洁,高效,优美才是一个好的语言的基本特征
而某些希望在语言元素中,一切都是对象的人,
只是一个可怕的偏执狂而已
看看这样一个语法吧:
DateTime.Now.ToString();
DateTimeToStr(Now);
或者 DateTimeToStr(SysUtils.Now)
呵呵,不知道你更喜欢哪一种
 
这几天晕头晕脑的。上边的一个关于C++构建函数的说法错误.已经修改.
C++的虚拟构造函数可以通过工厂模式来模拟实现.其主要原因的确是设计理念的不同.DELPHI之所以可以支持虚拟构造函数,是因为它有比较完善的RTTI信息.而C++因为支持多重继承等,包括语言设计的原因,是比较难做的.因此只能以工厂模式这种后天的弥补.
相较语法而言,我比较喜欢C#的风格.简洁而明快.(虽然也有不如意的地方,比如方法必须存在于类中,虽然CLR支持全局方法)
 
C++构造函数不能是虚函数是因为C++的RTTI信息不够的先天不足导致的.
当然C++的设计者也是有它的考虑的.就是让编译器做的事情足够少
因为信息不够,所以如果是虚函数的话创建的时候不知道要创建的是祖先类还是子类.
而Delphi的强大RTTI信息则可以克服这个,使它的语言功能更多.
 
由自己来实现和由编译器实现是不同的,
不可能每人都去实现它, 而且也需要技术基础和一定的能力,
Delphi对虚拟构造和析构的支持从TObject就开始了,
可以看一下所有类的VMT中的一段
?8 Pointer entry point of AfterConstruction method
?4 Pointer entry point of BeforeDestruction method
?0 Pointer entry point of Dispatch method
?6 Pointer entry point of DefaultHandler method
?2 Pointer entry point of NewInstance method
? Pointer entry point of FreeInstance method
? Pointer entry point of Destroy destructor
这些都是在TObject就实现的虚拟方法,
并且已经支持了Win32的消息处理机制
Delphi中的构建也是通过调用构造函数来实现的,
支持虚拟构造函数,可方便的根据类型来构造对象,
这在C++中几乎是不可能直接做到的,需要使用特殊的技巧
而在Delphi中,一种特殊的类型
type
TFormClass = class of TForm;
这种类型使用起来很简洁,功能也很强大
不用使用 typeof 等运算符,
类型变量,和类型可以直接赋值,可以直接调用,
语法比C#可要简洁多了
在语言风格上,Delphi和C++的一个很大的区别就是
语句块的语法不同,C++的看上去更简洁一些
再者,C++是函数式语法,
而Delphi则很少使用缩写等不直观的表达,
更贴近于自然语言,这也是很多人说它风格优美的一个重要原因
当然对于语言语法很熟练的人来说,
哪种语法,对于程序的可读性,可能差别不大
 
以下留言只代表 CSDN 网友个人观点,不代表 CSDN.NET 观点!
@ 2005.10.3 11:18 sweetgun 发表评论
楼主的理解偏了。首先您所说的实函数和虚函数的分别是不存在的。虚函数与其他函数的唯一区别就是动态绑定,即通过变量调用方法的时候,根据变量指代的实际实例类型来调用函数,而不是变量类型来调用函数。
c++中的构造函数没有虚拟的必要,因为C++中的构造函数必须是同类名称一样的函数。子类名称不能和父类一样,虚拟有什么用?!其次,子类的构造函数中自动调用父类的构造函数,当然程序员也可以指定调用特定的构造子。而Delphi中必须使用inherited 指示字显示调用父类的构造函数。
还有,不管是Delphi,还是C++,构造函数的作用都只是初始化对象,对象内存的分配是语言机制实现的,编译器管理的。事实上,我们可以认为构造函数和其他成员函数是没有什么本质区别的,构造函数的唯一特性就是对象创建后会被自动调用。
 
看看下面,不懂装懂的人对Delphi别说三道四,OK?
李维关于Delphi路线图
日期:2005年10月2日 作者:李维 人气:730 查看:[大字体 中字体 小字体]

Dexter(D2006)將會加入C/C++ Personality,Together For Delphi/C#,ECO III等等,這我已經在以前的Blog中寫過了。Delphi 2007將支持.NET Framework 2.0,VCL For Compact Framework以及VCL.NET 2.0,此外也會提供原生64位元的開發能力,提供Delphi For Win64。目前我並不確定Borland會不會把實驗室中最新的64位元C/C++編譯器也拿出來。至於Delphi 2008則會以支援MS的Vista技術為主。

想想Delphi未來會提供客戶什麼樣的技術,
n VCL會有VCL For Win32,VCL For Win64,VCL For .NET,VCL For Compact Framework,VCL For Avalon等。一套相同的Framework將會允許開發人員使用熟悉的技術開發各種不同的應用程式。VCL不但沒有走入歷史,而是更加蓬勃的發展,保障了客戶的投資。
n Delphi 編譯器 For Win32,Delphi 編譯器 For Win64,Delphi 編譯器 For .NET 1.x,Delphi 編譯器 For .NET 2.x,C/C++ For Win32編譯器,C/C++ For Win64/.NET編譯器(可能,現在我不知道確定的答案)允許開發人員使用相同的程式碼在不同的平台間移植,減少客戶在不同平台之間的開發成本。

當然,上面只是Delphi未來版本中最重要的目標,未來的Delphi當然會有更多其他重要的功能,例如ECO IV,ECO V,ECO…,此外Danny也在他的Blog中說了,Delphi也會支援LINQ技術,以及更強大的IDE(更多的refactorings, 更多類似Coderush的功能,CUnit for C/C++?)看來Delphi又恢復了Delphi以往的活力朝氣。再對照現在Delphi團隊努力打造的Dexter,在每一個Build都更穩定,更快速,我希望這次Delphi團隊能夠堅持到最後,品質好了再推出Delphi 2006。
 
不管别人说什么, 要相信自己
从Delphi 转向 Delphi.Net 比任何一种语言或工具转向 .Net 的代价都要小
对开发习惯和积累的经验都能更大程度的继续
但很多人无视这个好处,对M$总是趋之若骛
我想,大概是Borland的IDE 太过于庞大,和启动缓慢,让人太失望了
希望D2006 不会让大家失望
 
多人接受答案了。
 
后退
顶部