在需要的时候可以给get、set加修饰符

问题场景:

我在写一个低层的东西,有一个类,其中一个字段我希望可以在其它的dll中获得该字段的值,而只能在类所在的dll中修改其值。

下面是我解决这个问题的步骤,三种解决方案。

1.第一反应的解决方案:

None.gif class  A
ExpandedBlockStart.gifContractedBlock.gif
dot.gif {
InBlock.gif    
private string _name;
InBlock.gif
InBlock.gif    
public string Name
ExpandedSubBlockStart.gifContractedSubBlock.gif    
dot.gif{
ExpandedSubBlockStart.gifContractedSubBlock.gif        
get dot.gifreturn _name; }
ExpandedSubBlockEnd.gif    }

InBlock.gif
InBlock.gif    
internal string Name
ExpandedSubBlockStart.gifContractedSubBlock.gif    
dot.gif{
ExpandedSubBlockStart.gifContractedSubBlock.gif        
set dot.gif{ _name = value; }
ExpandedSubBlockEnd.gif    }

ExpandedBlockEnd.gif}

None.gif

 

也许你跟我一样会觉得这个方案可以,但是事实并非如此,此解决方案编译通不过,错误信息使对Name重复定义,也就是说.net framework 不允许将一个属性的geterseter分开去写。

2.第二种解决方案

既然不让声明两次属性名Name,那就只好将set改成方法了。 

None.gif class  A
ExpandedBlockStart.gifContractedBlock.gif
dot.gif {
InBlock.gif    
private string _name;
InBlock.gif
InBlock.gif    
public string Name
ExpandedSubBlockStart.gifContractedSubBlock.gif    
dot.gif{
InBlock.gif
ExpandedSubBlockStart.gifContractedSubBlock.gif        
get dot.gifreturn _name; }
ExpandedSubBlockEnd.gif    }

InBlock.gif    
internal public void SetName(string value)
ExpandedSubBlockStart.gifContractedSubBlock.gif    
dot.gif{
InBlock.gif
InBlock.gif        _name 
= value;
ExpandedSubBlockEnd.gif    }

ExpandedBlockEnd.gif}

None.gif

这种方法是可行的,但是不太好,继续思考,.net不能这么弱吧……于是有了一个正确的方法。

3. 正确的解决方案 

None.gif class  A
ExpandedBlockStart.gifContractedBlock.gif
dot.gif {
InBlock.gif    
private string _name;
InBlock.gif
InBlock.gif    
public string Name
ExpandedSubBlockStart.gifContractedSubBlock.gif    
dot.gif{
ExpandedSubBlockStart.gifContractedSubBlock.gif        
get dot.gifreturn _name; }
ExpandedSubBlockStart.gifContractedSubBlock.gif        
internal set dot.gif{ _name = value; }
ExpandedSubBlockEnd.gif    }

ExpandedBlockEnd.gif}

None.gif

internal关键字是可以修饰getset的。

 

这个问题非常简单,但是却很容易被第一种方法,拖入第二种方法的陷阱中,而忘了第三种正确的方法。

 

稍稍引申一下:

1.既然可以给geter或者seter加修饰符,可否同时给geterseter加上修饰符 

None.gif class  A
ExpandedBlockStart.gifContractedBlock.gif
dot.gif {
InBlock.gif    
private string _name;
InBlock.gif
InBlock.gif    
public string Name
ExpandedSubBlockStart.gifContractedSubBlock.gif    
dot.gif{
ExpandedSubBlockStart.gifContractedSubBlock.gif        
internal get dot.gifreturn _name; }
ExpandedSubBlockStart.gifContractedSubBlock.gif        
private set dot.gif{ _name = value; }
ExpandedSubBlockEnd.gif    }

ExpandedBlockEnd.gif}

None.gif

结果编译不能通过,错误是:不能为属性或索引器“A.Name”的两个访问器同时指定可访问性修饰符,也就是说geter或者seter中只能有一个指定修饰符,而不能同时指定修饰符,这样做的话默认修饰符就没有了意义。

2.只给geter或者seter中的一种加上修饰符,换一种方式写 

None.gif class  A
ExpandedBlockStart.gifContractedBlock.gif
dot.gif {
InBlock.gif    
private string _name;
InBlock.gif
InBlock.gif    
internal string Name
ExpandedSubBlockStart.gifContractedSubBlock.gif    
dot.gif{
ExpandedSubBlockStart.gifContractedSubBlock.gif        
get dot.gifreturn _name; }
ExpandedSubBlockStart.gifContractedSubBlock.gif        
public set dot.gif{ _name = value; }
ExpandedSubBlockEnd.gif    }

ExpandedBlockEnd.gif}

None.gif

这一次编译又报错了,.net说:访问器的可访问性修饰符必须比属性或索引器“A.Name”具有更强的限制,也就是说我们给geterseter所加的修饰符,必须是比属性上的修饰符更强的修饰符时才可以。

 

结论:

我们可以给Propertygeter或者seter中的某一个加上修饰符,条件是所加修饰符必须比Property定义的修饰符具有更强的限制。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值