c# get set函数浅析(转)

转载:http://kb.cnblogs.com/page/50502/

C# get set函数很常用,但是用好还是需要很多经验的,下面的文章就是帮你积累C# get set函数经验的。

  C# get set不提倡将域的保护级别设为 public而使用户在类外任意操作--那样太不OO,或者具体点说太不安全!对所有有必要在类外可见的域,C#推荐采用属性来表达。属性不表示存储位置,这是属性和域的根本性的区别。下面是一个典型的属性设计:

 

using System;  
class MyClass
{
int integer;
publicint Integer
{
get {return integer;}
set {integer=value;}
}
}
class Test
{
publicstaticvoid Main()
{
MyClass MyObject
=new MyClass();
Console.Write(MyObject.Integer);
MyObject.Integer
++;
Console.Write(MyObject.Integer);
}
}

  一如我们期待的那样,程序输出0 1。我们可以看到属性通过对方法的包装向程序员提供了一个友好的域成员的存取界面。这里的value是C# get set的关键字,是我们进行属性操作时的set的隐含参数,也就是我们在执行属性写操作时的右值。

  属性提供了只读(get),只写(set),读写(get和 set)三种接口操作。对域的这三种操作,我们必须在同一个属性名下声明,而不可以将它们分离,看下面的实现:

 

class MyClass  
{
privatestring name;
publicstring Name
{
get
{
return name;
}
}
publicstring Name
{
set { name = value; }
}
}

  上面这种分离Name属性实现的方法是错误的!我们应该像前面的例子一样将他们放在一起。值得注意的是三种属性(只读,只写,读写)被C# get set认为是同一个属性名,看下面的例子:

 

class MyClass  
{
protectedint num=0;
publicint Num
{
set
{
num
=value;
}
}
}
class MyClassDerived: MyClass
{
newpublicint Num
{
get
{
return num;
}
}
}
class Test
{
publicstaticvoid Main()
{
MyClassDerived MyObject
=new MyClassDerived();
//MyObject.Num= 1; //错误 !
((MyClass)MyObject).Num =1;
}
}

由于属性的方法的本质,属性当然也有方法的种种修饰。属性也有5种存取修饰符,但属性的存取修饰往往为public,否则我们也就失去了属性作为类的公共接口的意义。除了方法的多参数带来的方法重载等特性属性不具备外, virtual, sealed, override, abstract等修饰符对属性与方法同样的行为,但由于属性在本质上被实现为两个方法,它的某些行为需要我们注意。看下面的例子:

 

abstractclass A  
{
int y;
publicvirtualint X
{
get
{
return0; }
}
publicvirtualint Y
{
get { return y; }
set { y = value; }
}
publicabstractint Z { get; set; }
}
class B: A
{
int z;
publicoverrideint X
{
get { returnbase.X +1; }
}
publicoverrideint Y
{
set
{
base.Y = value <0?0: value;
}
}
publicoverrideint Z
{
get
{
return z;
}
set
{
z
= value;
}
}
}

  这个例子集中地展示了属性在继承上下文中的某些典型行为。这里,类A由于抽象属性Z的存在而必须声明为abstract。子类B中通过base关键字来引用父类A的属性。类B中可以只通过Y-set便覆盖了类A中的虚属性。

  静态属性和静态方法一样只能存取类的静态域变量。我们也可以像做外部方法那样,声明外部属性。以上就是对C# get set的简单介绍。

发布了153 篇原创文章 · 获赞 52 · 访问量 16万+

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 大白 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览