有趣,看看Delphi的property和C#的field

Delphi的书说,property是Delphi的新发明。看看它的实现方式:

private
    age: Integer;
    Function GetAge:Integer;
    Procedure SetAge(const Value:Integer);
public
    property Age:Integer read age write age;
implementation
    Function GetAge:Integer
    begin
         result := age;
    end;
    Procedure   类名.SetAge(const Value:Integer)
    begin
        if (Value = age) then exit;
        age = Value;
    end;
......

请看,和C#的filed何其相似啊,只不过在C#中是使用get、set访问器来实现的而已。

在java和c++中,都没有实现这种特性。如果要完成对类中的私有变量的读写,只能是自定义get和set方法。调用的时候,也是调用这些方法。而在delphi中,可以直接读写property,同样的在C#中则直接调用field。

同样的,在delphi里,property不能作为参数传递给procedure;而在C#中,field也是不能作为参数传递给方法的。何其相似啊!

想来也不奇怪,我记得delphi的创始人(我忘记名字了,呵呵),就是被微软从inprise挖去的,然后又主持了.Net的开发。所以借鉴delphi的一些特性,也是顺其自然的事吧。

C#是一门新语言,然而正因为其新,出生在c++、java以及delphi之后,所以才能借鉴他们的优势;更因为新,所以可以摒弃遗老的气息,显得魅力非凡。

说实话,我在打前面那段delphi代码才是痛苦,大小写老是出错,冒号也总是忘了加,真是痛苦。不过这和习惯有关,而和语言无关。习惯了c#,自然喜欢c#的很多好处了。
 

btw:在看delphi的这本书时,将property翻译为特性。所以当我最初看到的时候,还以为是近于C#的attribute呢。关于property和attribute在翻译的时候老是容易混淆。个人认为,最好是不要翻译成汉语,实在要翻译,我推荐将property翻译为“属性”,而将attribute翻译为“特性”。
       

posted on 2004-11-17 17:30 张逸 阅读(2871) 评论(15)  编辑 收藏 所属分类: C# Programming

评论

#1楼  2004-11-17 17:47 Ninputer [未注册用户]

晕了,你提到field是什么,难道不是property吗?field不就是变量吗?怎么会和Delphi的属性一样呢?C#的field怎么可能不允许将field传递给函数作参数呢?   回复  引用    

#2楼  2004-11-17 18:12 鳄鱼先生 [未注册用户]

呵呵,又是一个又Delphi转C#的朋友哈~~
是的,Delphi与.Net里的东东是有一些相适的地方。   回复  引用    

#3楼  2004-11-17 18:15 Allen Lee      

其实C++也可以,且看Borland C++ Builder 6.0对C++扩展了__property关键字:

class Person
{
    
public:
        Person(AnsiString name)
        
{
            
if (name != "")
                m_Name 
= name;
            
else
                m_Name 
= "UNKNOWN";
        }

        
~Person() { }

        __property AnsiString Name 
= read = ReadName, write = WriteName };

    
private:
        AnsiString m_Name;
        AnsiString ReadName();
        
void WriteName(AnsiString name);
}
;

AnsiString Person::ReadName()
{
    
return m_Name;
}


void Person::WriteName(AnsiString name)
{
    
if (name != "")
        m_Name 
= name;
    
else
        m_Name 
= "UNKNOWN";
}

接着你可以:

Person p = new Person("Allen Lee");
editBox1.Text 
= p.Name;

不知道我有没有写错,因为已经一年多没有拿起C++了。

另外,你可能对C#的field和property混淆了,请看:

class Person
{
    
private string m_Name;
    
public string Name
    
{
        
get return m_Name; }
        
set { m_Name = value; }
    }

}

其中,m_NamefieldNameproperty,C#也同样采用着Delphi的PME模式(Property, Method, Event)。

Hope that helps,

Allen Lee

 

  回复  引用  查看    

#4楼  2004-11-17 21:03 古月春秋 [未注册用户]

那个家伙叫 Anders
还有,DELPHI里面property一般都是称为属性的,不知道你看的是哪本书叫特性
DELPHI不区分大小写,不知道打字方面和C#相差多少? :)   回复  引用    

#5楼  2004-11-17 21:31 Yok      

很久以前VB就有property,不知哪个最早...   回复  引用  查看    

#6楼  2004-11-18 08:22 Ninputer [未注册用户]

VB4开始有的Property,那时候Delphi是2.0,还真难说有没有Property。不过VB4-6以及Delphi的Property都比C#的Property功能强大。
关键是搂主的“C#的field”是说什么,你们都没有异议吗?   回复  引用    

#7楼 [楼主] 2004-11-18 09:24 wayfarer      

呵呵:) 真是闹笑话了。Ninputer说的对,我这里表达的意思不应该是field,而是property,大家看我文章中写的所谓“get,set”访问器,就应该知道了。所以,我要比较的是delphi的property和c#的property。

另外,我不是从delphi转C#。事实上,我用c#已经用了一段时间了。现在只是因为项目需要,重新再看delphi而已。我不知道delphi对大小写是否敏感,例如Fuction和function会有什么区别。事实上,c#反而会对大小写敏感。我所说的大小写老是出错,只是因为不熟悉delphi的命名规则而已。习惯了c#的方式,一时很难改过来。

Allen Lee说的C++ Builder里提供了property,可能是吧,看来我是孤陋寡闻了,不过我记得VC里是没有的。VB有没有,我不太清楚。

所以,正确的说法,我是指C#的property是不允许作为方法的参数!

Ninputer说,“不过VB4-6以及Delphi的Property都比C#的Property功能强大。 ”是这样吗?从delphi的property看,和C#的property也没什么区别啊,看不出来有什么强大的地方。实际上C#的property编译为IL后,其实就是get和set的两个方法而已。我想对于field的读写,所有的操作用方法足以应付了吧。

btw:通常国内对property的翻译都是“属性”。不过就那么巧,我看到的delphi这本书里,确实就翻译为“特性”了。事实上,还有很多书会把attribute翻译为“属性”。所以我认为还是不翻译的最好。

  回复  引用  查看    

#8楼  2004-11-18 09:54 Ninputer [未注册用户]

Delphi的Property可以映射到特定的Read, Write函数上,也可以直接映射到变量上,就不用写函数了。Delphi的Property可以用Implements语句实现接口,用一个属性实现整个接口的语法哦,C#是没有这种功能的。

VB4-6的属性分为三种访问器,Get, Set和Let,可以组合出更多语法。VB的属性Get、Set和Let的访问级别可以不一样,因此属性在不同上下文就呈现不同的可读写性。此外VB的属性还可以带参数,可以按引用传递(就是C#的ref)……所有这些C#都不支持。   回复  引用    

#9楼  2004-11-18 10:10 Ninputer [未注册用户]

此外,我不记得C#有“property是不允许作为方法的参数”这么让人不爽的限制。我看是property不允许作为方法按引用传递(ref)的参数才对吧。不信你试试看。   回复  引用    

#10楼 [楼主] 2004-11-18 10:28 wayfarer      

@Ninputer:
you are right. 正如你所说,属性可以作为方法参数,但不能作为ref和out参数。

惭愧:(

thanks.

  回复  引用  查看    

#11楼  2004-11-18 12:45 5drush [未注册用户]

一般我在习惯上把field当做常量,当然你要不这么认为也可以,那么field和property没有什么区别了   回复  引用    

#12楼  2004-11-18 14:37 Ninputer [未注册用户]

97年我第一次看到了VB的Property,第一眼我就觉得是个好东西。之后我就再没离开过。我认为我对Field和Property是分的清的,我从来不把它们看成一类东西。有些人认为Property就是在Get里面返回field的值,Set里面给field赋值,甚至只读的Property就对应readonly的field。我认为这样使用Property对field过于虔诚了,Property能做到的事不是呆板的field可以做到的。   回复  引用    

#13楼 [楼主] 2004-11-18 15:57 wayfarer      

“呆板”这个词用的好。自然对于field来说,可以是常量,比如加上const关键字,也可以是变量,因为他可以重新赋值。但property的灵活性显然非field可比。在c#中,其实完全可以把property看作是方法,只是对于对象的调用者来说,这种形式更方便而以。

你可以在property中加上很多逻辑或业务,加上逻辑判断,甚至可以加上异常处理,而这些,显然不是“呆板”的field所能做到的。另外,你还可以在property里写更多的操作,例如IO,极端地说,对数据库的操作都是可以的。只是C#不推荐这样做。说白了,它近似于C++的inline函数。对于inline函数来说,要求短小精干,如果将很多复杂的业务写到property中,那么专门写一个方法会更好。   回复  引用  查看    

#14楼  2004-12-19 09:31 amd [未注册用户]

就是太麻煩了,get set 都那麼麻煩.tmd   回复  引用    

#15楼  2007-04-25 10:05 super_kevin [未注册用户]

在delphi里,property不能作为参数传递给procedure ?

没有这种限制啊,如果这样,一个语句不是要分成几行来写 ?

记得是delphi1.0就有property啦,delphi的控件哪有不用property的啊   回复  引用    


标题  
姓名  
主页
Email (只有博主才能看到) 
验证码 *  看不清,换一张 [登录][注册]
内容(请不要发表任何与政治相关的内容)  
  登录  使用高级评论  新用户注册  返回页首  恢复上次提交      


相关链接:
 



导航

公告

logo.gif
我的著作与译作

《软件设计精要与模式》

《WCF服务编程》

MVP_Horizontal_BlueOnly.png

From 03-03-2006
Counter: site stats

与我联系

搜索

 

常用链接

我参加的小组

我参与的团队

随笔分类(243)

随笔档案(235)

最新随笔

积分与排名

最新评论

阅读排行榜

评论排行榜