经典讲解C#getset

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

孝昌网站制作公司哪家好,找成都创新互联公司!从网页设计、网站建设、微信开发、APP开发、成都响应式网站建设公司等网站项目制作,到程序开发,运营维护。成都创新互联公司从2013年创立到现在10年的时间,我们拥有了丰富的建站经验和运维经验,来保证我们的工作的顺利进行。专注于网站建设就选成都创新互联公司

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

 
 
 
  1. using System;  
  2. class MyClass  
  3. {  
  4. int integer;  
  5. public int Integer   
  6. {  
  7. get {return integer;}  
  8. set {integer=value;}  
  9. }  
  10. }  
  11. class Test  
  12. {  
  13. public static void Main()  
  14. {  
  15. MyClass MyObject=new MyClass();  
  16. Console.Write(MyObject.Integer);  
  17. MyObject.Integer++;  
  18. Console.Write(MyObject.Integer);  
  19. }  

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

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

 
 
 
  1. class MyClass  
  2. {  
  3. private string name;  
  4. public string Name  
  5. {  
  6. get { return name; }  
  7. }  
  8. public string Name  
  9. {  
  10. set { name = value; }  
  11. }  
  12. }  

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

 
 
 
  1. class MyClass  
  2. {  
  3. protected int num=0;  
  4. public int Num  
  5. {  
  6. set 
  7. {  
  8. num=value;  
  9. }  
  10. }  
  11. }  
  12. class MyClassDerived: MyClass  
  13. {  
  14. new public int Num  
  15. {  
  16. get 
  17. {  
  18. return num;  
  19. }  
  20. }  
  21. }  
  22. class Test  
  23. {  
  24. public static void Main()  
  25. {  
  26. MyClassDerived MyObject = new MyClassDerived();  
  27. //MyObject.Num= 1; //错误 !  
  28. ((MyClass)MyObject).Num = 1;  
  29. }  
  30. }  

我们可以看到MyClassDerived中的属性Num-get{}屏蔽了MyClass中属性Num-set{}的定义。

当然属性远远不止仅仅限于域的接口操作,属性的本质还是方法,我们可以根据程序逻辑在属性的提取或赋值时进行某些检查,警告等额外操作,看下面的例子:

 
 
 
  1. class MyClass  
  2. {  
  3. private string name;  
  4. public string Name  
  5. {  
  6. get { return name; }  
  7. set 
  8. {  
  9. if (value==null)  
  10. name="Microsoft";  
  11. else 
  12. name=value;  
  13. }  
  14. }  

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

 
 
 
  1. abstract class A  
  2. {  
  3. int y;  
  4. public virtual int X  
  5. {  
  6. get { return 0; }  
  7. }  
  8. public virtual int Y  
  9. {  
  10. get { return y; }  
  11. set { y = value; }  
  12. }  
  13. public abstract int Z { get; set; }  
  14. }  
  15. class B: A  
  16. {  
  17. int z;  
  18. public override int X  
  19. {  
  20. get { return base.X + 1; }  
  21. }  
  22. public override int Y  
  23. {  
  24. set { base.Y = value < 0? 0: value; }  
  25. }  
  26. public override int Z  
  27. {  
  28. get { return z; }  
  29. set { z = value; }  
  30. }  

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

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

分享名称:经典讲解C#getset
标题路径:http://www.csdahua.cn/qtweb/news32/8132.html

网站建设、网络推广公司-快上网,是专注品牌与效果的网站制作,网络营销seo公司;服务项目有等

广告

声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 快上网