当前位置: 首页 > news >正文

[转]asp.net中get和set用法

     在早期学习c#的过程中,经常遇到这样的语句:

public string StudentName { get{return stuName;} set{stuName=value;} }   

      当时也不是很明白为什么要这样?学深了c#后,又没法对其做一个总结。今天看了《Visual c#.net程序设计教程》这本书,总结得不错,做下笔记:

      在许多面向对象程序设计语言中,属性(property)是指对象的特征和状态,具体地说就是指对象的数据成员。程序员可以指定数据成员能否被外界直接访问,如果数据成员被指定为public的,外界就可以用“对象名.公有数据成员名”访问该成员。c#是完全面向对象的语言,c#倡导一种新途径,对数据成员能够更好地封装和保护,同时又向外界提供更有效的访问形式。c#中用来达到这个目标的就是“属性”,而那些数据成员,在c#中称为“字段”或“域”。

      属性的定义和使用

      属性由两个部分组成:属性头和存储器。存储器分为get访问器和set访问器。声明属性的一般形式为:

      修饰符  类型  属性名

public string propertyName { get //get存取程序 {...} set //set存取程序 {...} }

      属性的修饰符可以是任何访问控制符(public/private/protected),还可以被定义为静态(static)。get和set是一种特定的方法,get用来从对象中读取数据,而set用来向字段写入数据,将外界的数据写入字段时,c#使用value表示输入的数据,value可以说是一个准关键字,例如:

set{aField=value;}

    以下是一个简单的例子,演示了属性的基本形式和用法:

using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace get与set用法 { public class Student//学生类 { //下面三个变量StruName,StuCollege,StuAge都是属性中的数据成员 private string StuName = "xuwei"; private string StuCollege = "CUGB";// private int StuAge = 24; public string studentNmae { /*get和set是一种特定的方法,get用来从对象中读取数据,而set用来向字段写入数据, * 将外界的数据写入字段时,c#使用value表示输入的数据,value可以说是一个准关键字,所以不需要声明value这个变量 */ get { return StuName;} set { StuName = value; } } public string studentCollege//学校名字不可改,所以没有set访问器,set用来修改studentCollege属性 { get { return StuCollege; } // set { StuCollege = value; } } public int studentAge { get { return StuAge; } set { StuAge = value; } } public string studentInfo { get { return "name:" + studentNmae + "," + "school:" + studentCollege + "," + "age:" + studentAge; } } } class Program { static void Main(string[] args) { Student stu = new Student(); Console.WriteLine(stu.studentNmae); stu.studentNmae = "xuyanghong";//可直接赋值,这里的值就是相当于前面的 set { StuName = value; } Console.WriteLine(stu.studentNmae); stu.studentAge = 25; stu.studentNmae = "zhangchengrong"; Console.WriteLine(stu.studentInfo); } } }

     上面代码中定义了一个属性studentName,它包含get访问器和set访问器。属性studentName封装了类Student中的字段 stuName,字段如果没有加访问控制符,被默认为private,外界不能直接访问它,现在外界可以通过studentName属性自由地存取 stuName字段了。

      属性的get和set都是可执行的程序语句组合,具有行为的特点;而使用具有get访问器和set访问器的属性时候就像使用字段一样,即可以作为左值接受数据,又可以作为右值输出数据,系统正是按照属性出现在语句中的位置,自动地选择是调用get还是调用set。

属性的读写控制

      属性中的get和set可以只用一个,如果只有get而没有set,那么这个属性只可读出,不可写入;如果只有set而没有get,那么这个属性是只写入,不可读出。

      在属性中完成更多功能

      既然get和set是程序,那当然可以做更多的事情。一个合理的分工是:设计字段是为了便于内部方法使用,而尽量与外界隔绝;设计属性考虑的是方便外界的使用,但是不让外界知道的数据一律不给。

总而言之:使用get和set能够让属性具有更好的封装性,而且既能够在等号的左边,又能在等号的右边。

相关文章:

  • C# 3.0 之 Partial Method 的使用
  • Linux系统下的DDOS***防范
  • ADO.NET 新特性之SqlBulkCopy
  • 基于OHCI的USB主机 —— USB设备取得设备描述符
  • linux学习小组成立!
  • System.Net.Dns.GetHostByAddress(string) 已经过时
  • 基础——使用视图和存储过程的优缺点
  • Delphi窗体の属性介绍
  • CSS学习系列十一:板式
  • Overload, Override and Overwrite ( copy)
  • 远程桌面连接
  • Bing Maps进阶系列八:在Bing Maps中集成OpenStreetMap地图
  • KiB是什么单位
  • 关注程序员健康之——白天打个盹提高记忆力
  • UML建模之业务处理模型(Business Process Model,BPM)
  • python3.6+scrapy+mysql 爬虫实战
  • js
  • js ES6 求数组的交集,并集,还有差集
  • LeetCode算法系列_0891_子序列宽度之和
  • log4j2输出到kafka
  • Node 版本管理
  • python大佬养成计划----difflib模块
  • vue从入门到进阶:计算属性computed与侦听器watch(三)
  • 阿里云Kubernetes容器服务上体验Knative
  • 初探 Vue 生命周期和钩子函数
  • 基于Volley网络库实现加载多种网络图片(包括GIF动态图片、圆形图片、普通图片)...
  • 基于web的全景—— Pannellum小试
  • 力扣(LeetCode)965
  • 每天一个设计模式之命令模式
  • 前端面试之CSS3新特性
  • 在GitHub多个账号上使用不同的SSH的配置方法
  • 微龛半导体获数千万Pre-A轮融资,投资方为国中创投 ...
  • ​比特币大跌的 2 个原因
  • $ git push -u origin master 推送到远程库出错
  • (bean配置类的注解开发)学习Spring的第十三天
  • (C语言)strcpy与strcpy详解,与模拟实现
  • (超简单)使用vuepress搭建自己的博客并部署到github pages上
  • (二)fiber的基本认识
  • (解决办法)ASP.NET导出Excel,打开时提示“您尝试打开文件'XXX.xls'的格式与文件扩展名指定文件不一致
  • (四)JPA - JQPL 实现增删改查
  • (五)网络优化与超参数选择--九五小庞
  • .bat批处理(三):变量声明、设置、拼接、截取
  • .NET 4.0中的泛型协变和反变
  • .NET MVC之AOP
  • .NET/ASP.NETMVC 大型站点架构设计—迁移Model元数据设置项(自定义元数据提供程序)...
  • :not(:first-child)和:not(:last-child)的用法
  • ?.的用法
  • @Autowired和@Resource的区别
  • [ Linux ] git工具的基本使用(仓库的构建,提交)
  • [AIGC] Nacos:一个简单 yet powerful 的配置中心和服务注册中心
  • [Bugku]密码???[writeup]
  • [BZOJ 4034][HAOI2015]T2 [树链剖分]
  • [C#] 我的log4net使用手册
  • [C#]扩展方法
  • [C/C++]关于C++11中的std::move和std::forward