c#中get、set方法的使用

老蒋 2009-07-27 09:58:51
我用get.set方法也有一段时间了,可以我对它们还是很困惑,其实将类字段设置成public也是可以的啊?有人说这样对类不安全,破坏了面向对象的意思,我是比较笨的那种,哪位可以帮我详细的解释一下吗?先谢谢了!
...全文
956 31 打赏 收藏 转发到动态 举报
写回复
用AI写文章
31 条回复
切换为时间正序
请发表友善的回复…
发表回复
让爱延续 2009-07-30
  • 打赏
  • 举报
回复
闲着没事,再补一贴(五楼):我理解的封装其中有一层保护的含义,即数据安全性。
slund 2009-07-28
  • 打赏
  • 举报
回复
实践得多了,你自然就会理解进去了。
  • 打赏
  • 举报
回复
用过才知道....
createTim 2009-07-28
  • 打赏
  • 举报
回复
属性验证
bl_song 2009-07-28
  • 打赏
  • 举报
回复
对这些还要慢慢实践才是。。。
dingpin 2009-07-28
  • 打赏
  • 举报
回复
[Quote=引用 26 楼 lcl_data 的回复:]
对这些还要慢慢实践才是。。。
[/Quote]
up
十八道胡同 2009-07-28
  • 打赏
  • 举报
回复
对这些还要慢慢实践才是。。。
xupeihuagudulei 2009-07-28
  • 打赏
  • 举报
回复
[Quote=引用 24 楼 slund 的回复:]
实践得多了,你自然就会理解进去了。
[/Quote]
V68V6 2009-07-27
  • 打赏
  • 举报
回复
[Quote=引用 19 楼 dancingbit 的回复:]
C# codeclass A
{private Int32 va;
...publicint VA
{set
{va=value;}get
{return va;}
}

假如原先的实现如上,然后我修改了实现:
C# codeclass A
{private Int64 va;
...publicint VA
{set
{if(va=value;}get
{return (int)va;}
}public Int64 VA64
{
...
}
内部的实现细节被隐藏了,相关的变化对原来的代码不会产生太大的影响,至多是重新编译的问题。

[/Quote]

芥子兄很好的代码诠释。。。

在没有实际项目经验的基础上,面向对象的理论确实让新手难以理解,即便是一些基本概念。
纯纯璐璐 2009-07-27
  • 打赏
  • 举报
回复
楼上各位说的很对!
dancingbit 2009-07-27
  • 打赏
  • 举报
回复
后面的set方法中多了if(
V68V6 2009-07-27
  • 打赏
  • 举报
回复
在一个类的内部还是建议使用字段,但对于多个类的交叉还是属性方便。免得牵一发而动全身。。
属性和私有字段以前没少讨论
参考
dancingbit 2009-07-27
  • 打赏
  • 举报
回复

class A
{
private Int32 va;
...
public int VA
{
set
{va=value;}
get
{return va;}
}


假如原先的实现如上,然后我修改了实现:

class A
{
private Int64 va;
...
public int VA
{
set
{if(va=value;}
get
{return (int)va;}
}
public Int64 VA64
{
...
}

内部的实现细节被隐藏了,相关的变化对原来的代码不会产生太大的影响,至多是重新编译的问题。
geforcelm 2009-07-27
  • 打赏
  • 举报
回复
写个例子:
private string userName = string.Empty;
public string UserName
{
set {
this.userName = "".Equals(value) ? "我是空的" : value;
}
}
那么这个属性就为只写。。如果写入为""的话。那么属性的值就为“我是空的”
private string userName = string.Empty;
public string UserName
{
get {
return "".Equals(value) ? "我是空的" : value;
}
}
那么这个属性为只读。。如果写入为“”的话。那么返回的值就为“我是空的”。。

不知道这样解释 和不合适
老蒋 2009-07-27
  • 打赏
  • 举报
回复
将来如果需要对内部实现作修改的话,也不会影响到使用它的代码????这句不是很明白,可否详细解释一下?
V68V6 2009-07-27
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 steedhorse 的回复:]
如果一个类有一个属性AAA,而且:
(1)AAA既实现了get,又实现了set;
(2)类中还有一个与AAA对应的同类型字段aaa;
(3)AAA的get就是简单的return aaa;没有其它代码;
(4)AAA的set就是简单的aaa = value;也没有其它代码;
——那你就当这是一种巧合算了。。。。
[/Quote]

不清楚你是指安全性还是指你的属性只存在GET或者SET二者中的任意一个。
不是属性里面必须要同时有取值和赋值的功能,有其一即可。它仅仅只是一扇小窗口,怎么用由你约定法则来控制。有些人只需从窗口取东西,有些人只需要往窗口里扔东西。
但属性也不是绝对的安全的,计算机中的安全永远是相对的。另外,属性的使用比对字段的使用可能更加耗费系统资源,但就其带来的好处来说这点资源损耗几乎可以忽略不计。
dancingbit 2009-07-27
  • 打赏
  • 举报
回复
区别?别人已经说得很明白了,对字段的访问是无法控制的,而对属性的访问可以通过代码来控制,有些条件下允许更改而有些条件不允许更改。

另外,作为属性实现的话,将来如果需要对内部实现作修改的话,也不会影响到使用它的代码。
V68V6 2009-07-27
  • 打赏
  • 举报
回复
属性是建立在字段的存在基础上的,更加灵活方便安全。。。
参考
晨星 2009-07-27
  • 打赏
  • 举报
回复
如果一个类有一个属性AAA,而且:
(1)AAA既实现了get,又实现了set;
(2)类中还有一个与AAA对应的同类型字段aaa;
(3)AAA的get就是简单的return aaa;没有其它代码;
(4)AAA的set就是简单的aaa = value;也没有其它代码;
——那你就当这是一种巧合算了。。。。
Hide1984 2009-07-27
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 jhg_2009 的回复:]
@快乐老妖,那属性也是public啊。这不等于这个大门关好了,另外开一个门让人随便拿,不知我的理解是不是有误///
[/Quote]

属性我可以只有Get()方法,没有set()方法啊,这样门不就关上了嘛
加载更多回复(11)

110,536

社区成员

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

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

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