作为一种面向对象的语言,对象的概念渗透在C#的每一种技术中,同时因为是在C++基础上发展起来的语言,C#有着一些和C++不同的面向对象语言特点,所以今天呢我就说一下C#中一种特殊的类成员,属性。
学习C语言的时候,我只知道变量和函数,即使后来用MFC,也只有了一点面向对象的概念。所以当我看到C#里面有着字段和属性两种群成员时,我的第一反应就是:WTF!!!但是我进一步学习之后,觉得有些东西并没有想象中的那么难。
首先是字段,字段就是变量啊,定义在类或者是结构体内的变量就是字段。除了名字以外我还没发现有什么不同。
然后是属性,按照我的理解,属性是定义在类里面的一种特殊的变量。它的特殊就特殊在对属性的读和写操作是可以不一样的,也就是get,set访问器。举例来说,我定义了一个类myClass,在类里,我定义了一个字段_test和一个属性test,可以看到字段_test和c++里面的私有变量并没有什么不同,但是属性test就不一样了,他下面按照set和get分成了两个代码块,分别代表对test进行读和写操作时运行的代码,看上去有点像if,else语句。
public class myClass
{
static private int _test=0;
static public int test
{
get { return _test; }
set { _test = value + 1; }
}
}
接下来我们在主函数中写入代码
static void Main(string[] args)
{
Console.WriteLine("{0}", myClass.test);
myClass.test += 1;
Console.WriteLine("{0}", myClass.test);
Console.ReadKey();
}
运行代码,控制台中输出
我们看到两次输出中间相差2,可是我们在主函数里只进行了一次自加操作,这是怎么回事呢。原因就在于属性的set访问器中。
当我们在主函数中运行
myClass.test += 1;
电脑首先读取myclass.test,对应的操作就是
get { return _test; }
此时得到的是_test的值,也就是0,接下来我们计算myclass.test+1,也就是得到数值1。
然后我们将得到数值再赋值给myclass.test,注意这时候属性的set访问器启动了,也就是
set { _test = value + 1; }
这个访问器在这里的意思的,把要赋给myclass.test的值+1后赋值给_test,这时候_test从0变成了2。
所以,当我们第二次打印myclass.test的 时候,电脑就会显示后来的_test值。
综上所述,属性的set,get访问器可以近似理解成一种变形的if,else分支语句,只不过它的判断条件是对变量的读还是写。
各位读者朋友,看完了本文如果觉得有用请点个赞。