![]() |
1
21
第一个示例的getter返回的是属性本身,而不是支持字段。
不幸的是,无法缩短您拥有的自动实现的属性(即
|
![]() |
2
8
getter引用自己(如安德鲁指出的),但setter也是错误的。 此代码:
…实际上没有设置任何内容。这个
另一件事你应该记住的是如果你是
或者您可以反转安全/不安全逻辑,例如:
不管是哪种方式,您的类都应该明确表示它正在进行某种编码,否则,如果您编写这样的代码:
…然后您将在输出中看到一组丑陋的转义字符
|
![]() |
3
4
第一个代码中出现堆栈溢出,因为属性getter返回属性本身。 这将导致getter被再次调用,直到堆栈溢出。 |
![]() |
4
2
导致stackoverflowException的代码没有为属性提供支持字段,get访问器返回属性本身,这就是导致堆栈溢出的原因。第二个示例提供了一个支持字段并返回其内容。 |
![]() |
5
2
听起来你想用 auto-implemented properties 在C 3.0中引入的特性,但使语法有点混乱。
返回
自动实现属性的正确语法如下。但是,它不能在get或set访问器中执行任何处理(实际上是根据定义)。
在您的例子中,由于您希望在“set”访问器上进行处理,所以使用支持字段的标准方法就是您想要的。 |
![]() |
6
2
记住,属性实际上是方法-它们的编译器会将它们转换为
所以您得到的是一个函数调用,它永远调用自己,所以堆栈溢出,因为每个调用都是堆栈推送。设置调用了一个函数,但从未将其值存储在任何地方。 |
![]() |
7
1
我认为你缺乏对属性的基本理解。属性不能包含任何数据,它只是一对getter方法和setter方法(也有一些属性只有getter或setter)。 getter方法基本上是一个不带参数并返回属性类型值的方法,而setter则是一个不带返回值的方法,该属性类型的参数称为value。C隐藏这两个方法,并将它们组合到一个属性中,您可以像普通字段一样调用它们。 您的第一个实现相当于:
现在您可以看到递归在哪里以及错误在哪里。此外,当您查看setter时,您会注意到它没有设置任何内容。htmlencode的返回值不会保存在任何位置。您需要提供一个支持字段(如第二段代码中的字段)。 但是,在C 3.0和更高版本中有自动实现的属性,您可以通过以下方式取消这些属性。请注意,C编译器将自动创建一个支持字段,因此基本上两种方法都是相同的,但第一种方法可以获得更大的灵活性,因为对于自动实现的属性,不能添加比简单的值设置和检索更复杂的行为(至少在声明它的类中,使其成为虚拟的将打开扩展子类..中属性逻辑的可能性。
最好的问候,
|
![]() |
8
1
这是一个很好的例子来阐述滥用递归编程;) 问题不在于属性,而在于从以下任何方法中获取值:
无论如何,dotnet属性是特殊类型的方法。不是吗? |
|
lfox · 如果列中不存在某个值,则停止代码执行 2 年前 |
![]() |
zaen · 将值传递到异常字符串消息中 2 年前 |
![]() |
Zephyr · 如何在双ListView选择系统上实现过滤器? 6 年前 |
![]() |
Aave · 错误数组长度的特定异常 6 年前 |