首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > C# >

问个愚蠢的有关问题,大家不要笑小弟我

2012-06-07 
问个愚蠢的问题,大家不要笑我。class a{private int m_aValuepublic int aValue{set { m_aValue value

问个愚蠢的问题,大家不要笑我。
class a
{
  private int m_aValue;
   
  public int aValue
  {
  set { m_aValue = value; }
  get { return m_aValue; }
  }
}
这样是不是很多余? 如果没有什么其他要考虑的情况,只是简单赋值,是不是直接用
class a
{
  public int aValue;
}
更好?


[解决办法]
区别在于:你想不想让外界知道aValue这个细节,
你可以借助set/get访问器隔离一些细节或者控制读写;
更多细节详见MSDN关于属性的文档:
http://msdn.microsoft.com/zh-cn/library/w86s7x04(VS.80).aspx
[解决办法]
推荐使用新语法:

C# code
class a{    public int aValue { get; set; }}
[解决办法]
C# code
class a{  public int aValue;}=>class a{    int aValue { get; set; }}
[解决办法]
问题可以这样描述
我是一个“人”我有一个“谓”
我的“谓”没天都要给他“赋值”
我的“口”是我开放出来的
如果你要想给我的“谓”“赋值”,那么就要通过我开放出来的“口”
也就是说我要吃包子,你给我鲍鱼,那么这时候我的“口”就吧你拒绝了。
[解决办法]
考虑到像实现INotifyPropertyChanged接口这样的问题(这个你迟早会碰到),“笨”的语法还是有应用场合的。

没这种要求的话,public string Name { get; set; }是最简单的表达方式了。


MEF中还有种语法
[Export]
class a
{
[Import]
public int aValue;
}

嘿嘿,也够简单了吧?
[解决办法]
其实 get set 是语法糖,最后转化为
get_属性名 和 set_属性名 两个方法。

严格地说,直接暴露公开成员变量的做法是违反OO原则的。
一个对象的状态应该由它内部去改变。
况且C#的设计者考虑到了语法的复杂性,已经提供了更简单的写法。所以直接public出成员变量的做法应该彻底摈弃。

学习语言绝对不是把它的语法走一遍,并且以发现这种语言还能如何如何写为能事。多了解语言的设计意图,比如C#是面向对象的语言,那么应该理解面向对象是什么。
[解决办法]
public int A;

A 仅仅是类中的字段 field 不能称之为属性 property

而属性是具有 get 和 set 访问器的,也可以看成是一种保护

比如 A 的值需要进行限制时(-100 < A < 100),情况就不一样啦

private int a = 0;
public int A
{
get { return a; }
set { if (...) a = value; }
}

而且通过访问器,可以判断出属性值是否发生了变更,从而触发对应的事件,例如 TextChanged
private string _Text = "";
public string Text
{
set {
if(_Text != value) {
_Text = value;
触发对应事件; }
}
}
[解决办法]
在字段当中我们一般就是将他封装在属性中进行调用,这样很给力,如果以后的编程方法中用到此字段又不需要进行其他方法的引用,我们就可以将它封装,其实你的那种方法不太好,老实说,你的方法如果初相在编译状态下会出现BUG,这可能在以后的代码维护阶段会出现问题!
[解决办法]
你的写法是很符合规范的,只不过繁琐一点罢了!
[解决办法]
探讨

问题可以这样描述
我是一个“人”我有一个“谓”
我的“谓”没天都要给他“赋值”
我的“口”是我开放出来的
如果你要想给我的“谓”“赋值”,那么就要通过我开放出来的“口”
也就是说我要吃包子,你给我鲍鱼,那么这时候我的“口”就吧你拒绝了。

[解决办法]
探讨
区别在于:你想不想让外界知道aValue这个细节,
你可以借助set/get访问器隔离一些细节或者控制读写;
更多细节详见MSDN关于属性的文档:
http://msdn.microsoft.com/zh-cn/library/w86s7x04(VS.80).aspx

[解决办法]
在属性中可以加入一些判断,也可以设置只读之类的,字段就不行了
[解决办法]
封装呀!
[解决办法]
第一次见到它的时候,觉得它的确很多余……
等接触深了,了解多了,想要它完成更多的功能的时候,它就来真的了……
------解决方案--------------------


一个字段,一个属性
不明白它们的区别
[解决办法]
VS为了安全设定的一种规则,其实也不太麻烦吧,这里体现了面向对象编程 的思想。
[解决办法]
你要知道属性,这东西是怎么出来滴就明白了

属性最早出现在delphi,vb6里面,你给color赋个blue,控件变蓝色了??
很奇妙把,IDE是如何知道你把这个color变更并且赋了blue呢?

你说我有一个方法去通知IDE不就可以了吗?问题是IDE又如何知道,你改变了color就得调用这个方法呢?
你说笨啊,我把赋值和调用一起告诉给IDE就是了

ok,属性出来了

set
{xxx=value;
通知ide去改变颜色();
}
[解决办法]
不多余
如果直接用public ,这个变量再任何类里面都可以被调用,安全性不高
如果用private,便定义了这个便量是私有的,只可以在这一个类中使用
顺便说一下,如果定义为protected,这个便量就只可以在这个类以及他的子类中使用
[解决办法]
实际上,在delphi里面属性 是两个方法写的

xxx_get()
xxx_set()

这么写不是很方便,所以c#里为了看着方便,就包装成了现在

xx
{
get{}
set{}
}
语法,无论是看着,还是写着都比delphi里面要方便很多了。
[解决办法]

探讨
其实索引器是为了保护类内部字段用的,主要是提供外部访问类的属性的接口。get和set定义了外部对于类属性的访问方式,是读写,还是只读。仅仅用public int aValue;是不安全的,如果你定义这个aValue外部只能访问而不能赋值的话,这样写外部是可以改变aValue的值的

[解决办法]
就以楼主的条件来说,后者确实更简单方便.

第一种写法,主要是方便类里面对数据的管理.

比如,类需要了解这个属性被读与被写的情况,以便作出相应的动作,那就只能这样做,并添加相应代码.

直接暴露的话,外部什么时候读了这个属性,什么时候写了这个属性,并不知道......

因此,在没有这种需求时,当然还是后者方便.
[解决办法]
补充一下.

第一种写法,是方便逻辑上的管理.

第二种写法,在没有上面的要求时,可以部分方便代码上的编写.

热点排行