SET如何在C#中使用属性?

Ric*_*d77 3 c#

我想知道如果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)

谢谢你的帮助

Chr*_*isF 9

你可以做你想做的.

没有什么可以阻止你:

set
{
    if (value < 0)
        myInt = 0;
    else
        myInt = value;
}
Run Code Online (Sandbox Code Playgroud)

(或者更紧凑的版本)

这就是设置者和吸气剂的设计目标.

如果值超出范围,您可以添加日志记录,调试断言甚至引发异常.

您的Setters和Getters的用户不会期望他们进行"大量"处理或有任何副作用.所以他们应该只影响他们的支持变量而不是处理1000个文本文件(作为例子).与数据库的连接很好,但是如果要获得大量数据,则应该使用显式函数替换Get.

另外,请注意@StingyJack在他的回答中所说的内容.


GvS*_*GvS 7

你可以用"套装"做任何事情.你问的具体例子:

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)


Chr*_*sic 5

属性编译为常规方法,因此您可以在set语句中执行任何操作.理论上,您甚至不需要访问单个成员变量或使用value关键字.尽管如此,使用setter而不是设置成员变量通常被认为是不好的做法.