在Set访问器中赋值,而不是使用Value关键字
本文关键字:关键字 Value 访问 Set 赋值 | 更新日期: 2023-09-27 18:03:44
我想知道为什么这段代码工作良好,编译器不产生任何错误或警告?
class Program
{
static int _value;
static int MyValue
{
get { return _value; }
set { _value = 5; }
}
static void Main()
{
Console.WriteLine(Program.MyValue); //This line print 0 (defoult value of int variables)and its normal
Program.MyValue = 10; //after calling the Set accssor we will see that
Console.WriteLine(Program.MyValue); //The result is 5
Console.ReadLine();
}
这是有用的或特殊的东西吗?或者它可能是属性初始化中的技术?提前谢谢。
编辑:似乎我们这里有一个Readonly属性默认值我对吗?
set-accessor就是一个带参数(value -形参)的方法。这取决于该方法做什么和不做什么。
void Set__MyValue(int value){
_value=5;
}
代码是有效的c#,因此不会导致错误或警告。
getter和setter中的代码可以是任何东西,所以不能真正进行静态检查——即使你做了一些奇怪的事情,比如忽略传递给setter的值,这可能正是你的代码的正确之处。
由于set
语句实际上只是指定完整方法(即set_MyValue(int value)
)的方便方式,因此适用所有函数的正常规则。特别是,如果您不想使用参数,则没有义务使用参数。
虽然您的示例是人为的,但在许多情况下忽略传入的value
是有意义的。例如,假设您希望确保特定的string
属性永远不为空。你可以这样做:
private string _myProp = string.Empty;
public string MyProp
{
get
{
return _myProp;
}
set
{
if (value == null)
{
_myProp = string.Empty;
return;
}
_myProp = value;
}
}
如果我们想忽略value
,则不忽略。
这段代码非常有效,在某些场景中也很有用。如果您想要在_value
更改时引发事件/WPF命令,请记录该内容,并在那里做任何其他对您有意义的内容。使用这种管理方式直接设置_value
会导致"静默"分配,通过属性设置_value
会导致通知。
问候。
该属性将在IL中转换为2个不同的方法(一个用于设置值,另一个用于返回值),并且在方法中忽略参数是有效的!
ildasm.exe
工具(Visual Studio自带的)来检查。