我想知道如果set不仅仅设置私有成员变量的值,它在一个属性中是如何工作的.假设我的班级中有一个私人成员(private int myInt).
例如,我可以确保返回的值不是负数
get
{
if(myInt < 0)
myInt = 0;
return myInt;
}
Run Code Online (Sandbox Code Playgroud)
使用SET,我所能做的就是像这样影响私有变量
set { myInt = value; }
Run Code Online (Sandbox Code Playgroud)
我没有在任何一本书中看到我如何能做到更多.如果在影响myInt的值之前我不想做一些操作怎么样?假设:如果值为负,则影响0到myInt.
set
{
//Check if the value is non-negative, otherwise affect the 0 to myInt
}
Run Code Online (Sandbox Code Playgroud)
谢谢你的帮助
你可以做你想做的.
没有什么可以阻止你:
set
{
if (value < 0)
myInt = 0;
else
myInt = value;
}
Run Code Online (Sandbox Code Playgroud)
(或者更紧凑的版本)
这就是设置者和吸气剂的设计目标.
如果值超出范围,您可以添加日志记录,调试断言甚至引发异常.
但
您的Setters和Getters的用户不会期望他们进行"大量"处理或有任何副作用.所以他们应该只影响他们的支持变量而不是处理1000个文本文件(作为例子).与数据库的连接很好,但是如果要获得大量数据,则应该使用显式函数替换Get.
另外,请注意@StingyJack在他的回答中所说的内容.
你可以用"套装"做任何事情.你问的具体例子:
set {
// Silently set to a more correct value
myInt = value < 0 ? 0 : value;
}
Run Code Online (Sandbox Code Playgroud)
要么
set {
// Always return error to caller
if (value < 0) {
throw new ArgumentException("value", "value cannot be negative.")
}
myInt = value;
}
Run Code Online (Sandbox Code Playgroud)
要么
set {
// When debugging, warn the developer, in release adjust value silently
Debug.Assert(value >= 0, "Value should 0 or larger");
myInt = value < 0 ? 0 : value;
}
Run Code Online (Sandbox Code Playgroud)
属性编译为常规方法,因此您可以在set语句中执行任何操作.理论上,您甚至不需要访问单个成员变量或使用value关键字.尽管如此,使用setter而不是设置成员变量通常被认为是不好的做法.
| 归档时间: |
|
| 查看次数: |
501 次 |
| 最近记录: |