OpenFileDialog opfd = new OpenFileDialog();
string str = opfd.FileName;
MessageBox.Show( "打开了对话框"+str );
以上代码中FileName为什么像方法一样会有返回值呢?而不能像其他它属性那样调用或者赋值呢?比如:要是opfd.FileName;就提示错误。
好吧,我明白啥意思了~~
@平常心队长: 表达不好,这个msdn我看了没有找到我的疑问,就是想知道FileName是属性,一般属性是通过=号赋值的,也就是FileName在等号左边,这里为什么要通过返回值的形式呢?一般方法不是才有返回值吗?
@寒江蓑立:
属性使类能够以一种公开的方法获取和设置值,同时隐藏实现或验证代码。
get 属性访问器用于返回属性值,而 set 访问器用于分配新值。这些访问器可以有不同的访问级别。有关更多信息,请参见非对称访问器可访问性(C# 编程指南)。
value 关键字用于定义由 set 索引器分配的值。
不实现 set 方法的属性是只读的。
对于不需要任何自定义访问器代码的简单属性,可考虑选择使用自动实现的属性。有关更多信息,请参见自动实现的属性(C# 编程指南)。
get 属性访问器用于返回属性值,而 set 访问器用于分配新值。这些访问器可以有不同的访问级别。有关更多信息,请参见非对称访问器可访问性(C# 编程指南)。
1、这里为什么要通过返回值的形式呢?
得到一个属性值是编程中需要的基本功能,当然也可以禁止此行为,但是 MS 选择了增加此行为;
2、一般方法不是才有返回值吗?
这里没有什么冲突的地方,属性和方法不是对立的两个概念。这就好比土豪可以买奢侈品,穷人也可以买。
@Launcher:那么在使用的时候如何知道一个属性应该是放在等号左边还是等号右边呢?
@寒江蓑立:你这个问法是有问题的,你应该修改成:那么在使用的时候如何知道一个属性是可以放在等号左边还是等号右边呢?
注意是“可以”,不是“应该”。不能因为是只读属性(它只能出现在等号的右边),我们就非得把原来的代码由修改值修改为获取值。那么这里的判断依据一是通过属性本身来判断,也就是是否实现了 get 、 set 访问器;二是依赖编译器,编译器会提示你的获取值或者修改值的语句是否合法。
或者:一个属性应该放在等号左边还是等号右边呢?
注意,我们去掉了“在使用的时候”这个前置条件,那么这里使用“应该”就是合理的。如果属性实现了 get 访问器,那么属性就可以放在等号的右边;如果属性实现了 set 访问器,那么属性就可以放在等号的左边。
@Launcher: 就连语言上都这么逻辑严谨,佩服呀,也谢谢耐心回答,我貌似明白了,我查了一下FileName属性是这样实现的: public string FileName { get; set; },那么这说明它是不是get和set都实现了呢?是不是get和set都实现了的属性既可以放在等号左边又可以放在等号右边,只读属性是不是只可以放在等号右边?谢谢!:)
@寒江蓑立: 基本正确,同时你还得考虑到 public 、protected、private、internal 修饰符。除了影响到赋值操作符以外,你还需要考虑到将属性作为函数的参数的形式,例如:
public class A {public Value{get;set;}}
void Add(int x,int y);
A a = new A;
Add(a.Value,10);
也就是说,这里受影响的是能否读取或设置此属性的值,而不只是在赋值操作符的左边还是右边的问题。
@Launcher: 晓得了,谢谢!
什么意思?
属性是有READ/WRITE两个方法的,也就是可以在等号的左边,也可以在右边。
方法却只能返回值。
这样你明白吗?
只读
楼上的楼上正解,通俗易懂。