先决条件:C#中的属性
属性是类成员的特殊类型,它提供了一种灵活的机制来读取,写入或计算私有字段的值。可以将属性当作公共数据成员使用,但实际上它们是称为访问器的特殊方法。这样可以轻松访问数据,并有助于提高方法的灵活性和安全性。信息的封装和隐藏也可以使用属性来实现。它使用预定义的方法,这些方法是“ get”和“ set”方法,有助于访问和修改属性。
句法:
{
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); } }
编译时错误:
prog.cs(19,3): error CS1007: Property accessor already defined
但是,通过在同一程序中使用不同类中的属性,可以多次使用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): warning CS0162: Unreachable code detected
输出:
5
从程序的输出可以看出,代码已成功运行,但由于无法访问而无法使用我们在get访问器中添加的值。这就是为什么在调用get访问器时无需更改基础变量的原因。