先决条件: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);
}
}
编译时错误:
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访问器时无需更改基础变量的原因。