| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 5239 人关注过本帖, 1 人收藏
标题:原来属性的Get和Set访问器还可以这样用
只看楼主 加入收藏
天堂落日
Rank: 2
等 级:论坛游民
威 望:2
帖 子:182
专家分:10
注 册:2007-6-17
结帖率:100%
收藏(1)
 问题点数:0 回复次数:8 
原来属性的Get和Set访问器还可以这样用
以前记得论坛有过一个帖子是专门讨论C#中属性的用处的
今天翻阅《C#高级编程》的时候又发现一条
C#允许给属性的get和set访问器设置不同的访问修饰符,所以属性可以有公共的get访问器和私有的或者是受保护的set访问器。这有助于控制属性的设置方式或者时间。
可惜的是书上给的例子完全错了,就是很普通的属性设置
程序代码:
public string Name
{
     get { return _name; }
     set { _name = value; }
}
这么好的书,这电脑的高科技的,怎么也这样蒙人啊?完完全全都是public访问级别嘛
后来经过自己尝试,发现正确的用法是这样的
public string Name
{
    get { return _name; }
    protected set { _name = value; }//注意看访问级别,和外层的不一样哦}
这样以来,就实现了get和set具备不同的访问级别啦
使用的时候 要主意以下几点:
1、定时属性的时候,外层一定要有访问级别修饰符(就是public string Name)这里啦

2、在定义get和set访问级别的时候,只能为其中一个单独设置
     意思就是说不能在get前边来一个public,然后在set前边再来一个修饰符,两个当中只有一个能设置的哦
      别扔转头,什么,不就是想给set和get两个设置不同的访问级别嘛,你以为第一条上说的外层的修饰符是干嘛用的?
     看例子,get前边没写访问修饰符吧?这样它的权限默认是外层的权限,也就是public啦
     set的权限我就不用再说了,前边白纸黑字,一个 protected 在那大大的竖着呢

3、外层的访问权限一定要比内层的更为宽松,这个也要主意,还说上边的例子
     为了实现同样的访问控制级别,如果你写成
程序代码:
 protected  string Name //外层protected
    {
        public get { return _name; } //内层public
        set { _name = value; } 
    }
这样就不行了,编译器是会报错的哦

[[italic] 本帖最后由 天堂落日 于 2008-1-23 13:27 编辑 [/italic]]
搜索更多相关主题的帖子: Get Set 属性 get set 
2008-01-23 13:23
andey
Rank: 2
等 级:新手上路
威 望:4
帖 子:938
专家分:0
注 册:2007-7-18
收藏
得分:0 
顶一下

msdn == 葵花宝典!!!
QQ:122768959
2008-01-25 10:42
marer
Rank: 2
等 级:新手上路
威 望:3
帖 子:928
专家分:0
注 册:2005-7-18
收藏
得分:0 
我有两个朋友是专门写程序书的,我知道里面的事,就一个字:蒙!我那哥们儿根本不会VB,出版社要出本VB的书让他写,我问他:你会吗?他说:不会,到网上down呗。书出来全部在网上或其他的书的一段一段的贴成的。

public class 人生历程 extends Thread{public void run(){while(true){努力,努力,再努力!!;Thread.sleep(0);}}}
2008-01-25 11:14
peach5460
Rank: 15Rank: 15Rank: 15Rank: 15Rank: 15
来 自:武汉
等 级:贵宾
威 望:30
帖 子:2780
专家分:6060
注 册:2008-1-28
收藏
得分:0 
哈哈
我也看到c#高级编程的那个get和set蒙了

明明数public...非说是有限定符的...害我郁闷半天

我总觉得授人以鱼不如授人以渔...
可是总有些SB叫嚣着:要么给代码给答案,要么滚蛋...
虽然我知道不要跟SB一般见识,但是我真的没修炼到宠辱不惊...
2008-01-29 21:47
guoxhvip
Rank: 8Rank: 8
来 自:聖西羅南看臺
等 级:贵宾
威 望:44
帖 子:4052
专家分:135
注 册:2006-10-8
收藏
得分:0 
作者也是人 肯定有失误的地方 自己学会分别就行啦

愛生活 && 愛編程
2008-01-30 00:34
沉沦过迁
Rank: 2
来 自:广西百色
等 级:论坛游民
帖 子:2297
专家分:10
注 册:2007-5-8
收藏
得分:0 
顶一个

也许我没有明天,但是我拥有现在
2008-01-30 12:58
qqbbaa
Rank: 1
等 级:新手上路
帖 子:27
专家分:0
注 册:2006-12-4
收藏
得分:0 
怪不得我老是式不成功~~~~原来问题出现在这里~~~~谢谢LS了~~~~
2008-02-08 18:14
yms123
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:209
帖 子:12488
专家分:19042
注 册:2004-7-17
收藏
得分:0 
也有些用处,比如某些时候某各类属性是只读的,但这时需要一个类来设置这个只读属性。而如果加set的话就会破坏原来的设计变为可读写,被外部就能够访问了。
不过仔细想想,也比较无用处,这样set属性指定为保护限制,按照面向对象的定义来说。只有一个类的子类才能使用保护修饰的内容,而直接把_name声明为
protected属性过程里只写get访问器,也能达到同样的效果。
比如
class A
{
   protected string _name;
   public string name
   {
       get
       {
           return this._name;
       }
   }
}
public class B:A
{
   public void Show()
   {
      this._name="abc";
      Conlose.WriteLine(this._name);
   }
}
同样的效果,父类的name属性只能在外部读取,只有继承的子类才能访问。
如果说做深层次的验证加访问修饰还是有用的,也就是说这个继承类封装dll后。
对被继承类的输入数据作验证。比如
class A
{
   private string _name;
   public string name
   {
       get
       {
           return this._name;
       }
       protected set
       {
          if(value=="")
             throw new Exception("姓名不能为空");
          this._name=value;
       }
   }
}
public class B:A
{
   public void Show()
   {
      this.name="abc";
      Conlose.WriteLine(this.name);
   }
}
2008-02-14 17:49
DOMYBEST
Rank: 1
来 自:郑州
等 级:新手上路
帖 子:9
专家分:0
注 册:2008-2-25
收藏
得分:0 
ding
2008-02-26 13:22
快速回复:原来属性的Get和Set访问器还可以这样用
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.026783 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved