属性和私有字段

flyuniverse_shell 2008-08-26 05:46:37
从下面的代码可以看到,属性和私有字段在类的内部在使用上或者在效果上没什么差异,是吗?
    class Men
{
private int id;
public int Id
{
get { return id; }
set { id = value; }
}

public Men(int c)
{
this.Id = c;//属性
this.id = c;//私有字段
}

}
...全文
472 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
badboyby 2009-03-21
  • 打赏
  • 举报
回复
看了上面的测试程序,我也在自己的机器上测试了。结果是3472和3478。我也认为代码的执行效率上不会有过于明显的区别。
C#中才有属性这个概念,而在JAVA和C++中却要自己编写Get和Set方法来实现属性。
微软应该也有在此点用于区别JAVA,显示自己的特性的用意。毕竟C#是比JAVA“出世"的晚点。
其次,面向对象的一个特性就是封装。这样在某一方面可以起到保护字段的作用。
比如在用户对A这个变量进行修改的时候,可能用户并不了解数据边界,在Set里,就可以写到if(value<0){A=**;}
我也很同意属性用来控制字段的读写性的这个观点。

当然,为了代码的可读性,这样做是很有必要的。
我也才开始学C#。请多指教。
ZengHD 2008-08-26
  • 打赏
  • 举报
回复
效率相关不大,但属性的作用比public string value1;强得多
flyuniverse_shell 2008-08-26
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 ZengHD 的回复:]
属性竟然还快?再测几次
[/Quote]
很多时候是属性慢些,但也有属性快的时候.不信你自己测!
再来10组:
私有字段: 3250 MSEL
属性: 3266 MSEL
私有字段: 3141 MSEL
属性: 3328 MSEL
私有字段: 3234 MSEL
属性: 3313 MSEL
私有字段: 3234 MSEL
属性: 3344 MSEL
私有字段: 3234 MSEL
属性: 3328 MSEL
私有字段: 3235 MSEL
属性: 3296 MSEL
私有字段: 3219 MSEL
属性: 3328 MSEL
私有字段: 3203 MSEL
属性: 3313 MSEL
私有字段: 3219 MSEL
属性: 3328 MSEL
私有字段: 3219 MSEL
属性: 3312 MSEL
ZengHD 2008-08-26
  • 打赏
  • 举报
回复
属性竟然还快?再测几次
flyuniverse_shell 2008-08-26
  • 打赏
  • 举报
回复
用下面的代码测试性能: 结果分不出高低!
using System;
using System.Collections.Generic;
using System.Text;
class Class1
{
private string value1;
public string Value1
{
get { return value1; }
set { value1 = value; }
}
public string Test1()
{
long vTickCount = Environment.TickCount;
for (int i = 0; i < 10000000; i++)
this.value1 = i.ToString();
return string.Format("私有字段: {0} MSEL", Environment.TickCount - vTickCount);
}
public string Test2()
{
long vTickCount = Environment.TickCount;
for (int i = 0; i < 10000000; i++)
this.Value1 = i.ToString();
return string.Format("属性: {0} MSEL", Environment.TickCount - vTickCount);
}
}
class Program
{
static void Main(string[] args)
{
Class1 tmpObj = new Class1();
Console.WriteLine(tmpObj.Test1());
Console.WriteLine(tmpObj.Test2());
Console.ReadLine();
}
}

结果:
私有字段: 3328 MSEL
属性: 3204 MSEL
liang4571231 2008-08-26
  • 打赏
  • 举报
回复
private int id;//私有变量
public int Id//公有属性
{
get { return id; }
set { id = value; }
}

内部时使用private的变量,外部时使用public的属性。
其实这个属性多的功能和窗体自有的Tag属性差不多,可做标记
wocow2316 2008-08-26
  • 打赏
  • 举报
回复
私有字段是内部用的,
属性是对外部暴露的,并可以设置一定的限制,从某种意义上讲,属性就像方法
ZengHD 2008-08-26
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 fly_to_the_winds 的回复:]
引用 3 楼 zhengshaodong 的回复:
字段 一般是设置成私有 只可以内部访问
属性 一般是可供外部访问的
属性可以设置成比如只写 , 只读 或者 可读可写
在内部上使用是没什么差异 比如你看Microsoft的类库 不都是开放属性给你访问吗

[/Quote]
在内部使用最好还是使用属性,在属性里还是可以做别的处理的,使用1楼的Age是不能为负数,如果使用字段,是可以赋负数
zhangxuyu1118 2008-08-26
  • 打赏
  • 举报
回复
属性是对私有资源的读写控制。
private int id;
public int Id
{
get { //可以加入一些规则,比如条件A返回0,比如条件B返回id。。。
return id; }
set { id = value; }
}
浮生若梦丶 2008-08-26
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 zhengshaodong 的回复:]
字段 一般是设置成私有 只可以内部访问
属性 一般是可供外部访问的
属性可以设置成比如只写 , 只读 或者 可读可写
在内部上使用是没什么差异 比如你看Microsoft的类库 不都是开放属性给你访问吗
[/Quote]
bayuan0414 2008-08-26
  • 打赏
  • 举报
回复
在类的内部也可以使用属性。
在新版的特性里面可以这样声明
class class1
{
public string Name{get;set;}
}
由编译器完成原先声明字段的工作,
这就相当于
class class1
{
private string name;
public string Name

}
yatobiaf 2008-08-26
  • 打赏
  • 举报
回复
属性的话做了一次取值的过程,但是这是外部类可见的。
私有字段的话只能在类的内部访问。
在类的内部应该用私有字段,避免了一次转换的过程,提高了效率。但如果用属性其实效果也一样。
zhengshaodong 2008-08-26
  • 打赏
  • 举报
回复
字段 一般是设置成私有 只可以内部访问
属性 一般是可供外部访问的
属性可以设置成比如只写 , 只读 或者 可读可写
在内部上使用是没什么差异 比如你看Microsoft的类库 不都是开放属性给你访问吗
ZengHD 2008-08-26
  • 打赏
  • 举报
回复
你这个看不出来,看下面的
private int age;
public int Age
{
get { return age; }
set
{
if (value >= 0 && value <= 150)
age = value;
else
age = 18;
}
}
北京的雾霾天 2008-08-26
  • 打赏
  • 举报
回复
在类的内部当然应使用字段,可是多个类的访问应该使用属性了。

110,535

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧