日期:2014-05-18  浏览次数:20849 次

问个愚蠢的问题,大家不要笑我。
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

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