C#如何理解属性限制(代码详细指南)

先决条件:C#中的属性
属性是类成员的特殊类型, 它提供了一种灵活的机制来读取, 写入或计算私有字段的值。可以将属性当作公共数据成员使用, 但实际上它们是称为访问器的特殊方法。这样可以轻松访问数据, 并有助于提高方法的灵活性和安全性。信息的封装和隐藏也可以使用属性来实现。它使用预定义的方法, 这些方法是" get"和" set"方法, 有助于访问和修改属性。
语法如下:

< access_modifier> < return_type> < property_name> { get { // body } set { // body } }

属性限制:在编写如下属性时, 我们必须遵循一些规则或限制:
属性不能通过ref或out参数传递给方法:属性不能通过out或ref传递,因为属性实际上是方法。在编译时,ref和out都不被认为是方法签名的一部分。因此,它将给出一个编译时错误。除了从程序中完全删除ref或out之外,没有办法解决这个限制。
不能重载属性:不能重载属性。这意味着只能分别在一个类中放置一个get和set访问器和mutator。下面给出的程序展示了在同一个类中提供多个get访问器时会发生什么。
// C# program to show what happens when // we try to overload a property using System; class Myprop {int _number; public int Number { get { return this ._number; } set { this ._number = value; } get {// Causes a compile time error // which tells get accessor return this ._number; } // has already been called. } }// Driver Class class GFG {// Main Method static void Main() { Myprop ex = new Myprop(); // set { } ex.Number = 5; console.WriteLine( "If there are only two properties" + " in class ex we will get the output" ); // get { } Console.WriteLine(ex.Number); } }

编译时错误:
【C#如何理解属性限制(代码详细指南)】prog.cs(19, 3):错误CS1007:属性访问器已定义
但是通过使用不同类别的属性在同一个程序中, 可以多次使用get和set方法。下面给出了说明这一点的示例。
// C# program to demonstrate the use // of properties in different classes using System; class Myprop {int _number; public int Number { get { return this ._number; } set { this ._number = value; } } }class Myprops {int _number; public int Number { get { return this ._number; } set { this ._number = value; } } }// Driver Class class GFG {// Main Method static void Main() { Myprop ex = new Myprop(); Myprops exs = new Myprops(); // Calls set mutator from the Myprops class exs.Number = 7; // Calls set mutator from the Myprop class ex.Number = 5; // Gets the get accessor form the Myprop class Console.WriteLine( "The value set in the class " + "Myprop is: " + ex.Number); // Gets the get accessor form the Myprops class Console.WriteLine( "The value set in the class" + " Myprops is: " + exs.Number); } }

输出如下:
The value set in the class Myprop is: 5 The value set in the class Myprops is: 7

当调用get访问器时,属性不应该改变基础变量的状态:属性的get访问器被设置为只读模式,而set命令被设置为只写模式。因此,如果我们试图在get访问器的范围内输入值或修改值,就会得到一个警告,告诉我们试图访问的代码不可访问。下面给出的例子说明了这一点。
// C# program to demonstrate the // above-mentioned restriction using System; class Myprop {int _number; public int Number { get { return this ._number; // We get the warning saying that // the code is unreachable. this ._number = 5; } set { this ._number = value; } } }// Driver Class class GFG {static void Main() { Myprop ex = new Myprop(); // set { } ex.Number = 5; // get { } Console.WriteLine(ex.Number); } }

警告:
prog.cs(16, 4):警告CS0162:检测到无法访问的代码
输出如下:
5

从程序的输出可以看出, 代码已成功运行, 但由于无法访问而无法使用我们在get访问器中添加的值。这就是为什么在调用get访问器时无需更改基础变量的原因。

    推荐阅读