C#属性详解及属性与函数间的对比
属性:get { //读属性代码 } set { //写属性代码 }
public class Person
{
private string name;
public string Name
{
get{return name;}
set{ name=value;}
}
}
属性可以忽略get或set访问器,但是不能两个都忽略.
set访问器包含一个隐藏的参数value,该参数包含从客户代码传送过来的值.
公共属性及其底层类型最好使用相同的名称,因为它们之间的联系将很清晰.
字段使用camelCase(xxXxx),如dateOfBirth,而属性使用PacalCase(XxXxx),如DateOfBirth.一些开发人员喜欢在字段的开头使用下划线,如_Name,属性也应使用名词来命名.
c#通过属性特性读取和写入字段,而不直接读取和写入,以此来提供对类中字段的保护.
属性按可以访问的类型分为三种不同的类型:
一.读/写属性
读/写属性是一个具有get()和set()访问器的属性.
语法: [访问修饰符] 数据类型 属性
{
get{ };
set{ };
}
二.只读属性
仅具有get()访问器属性称为只读属性.
语法: [访问修饰符] 数据类型 属性名
{
get{ };
}
三.只写属性
仅具有set()访问器属性称为只写属性,不推荐使用只写属性.
语法: [访问修饰符] 数据类型 属性名
{
set{ };
}
示例:
using System;
namespace Example1
{
class Student
{
#region/***属性***/
/// <summary>
/// 姓名
/// </summary>
private string name;
public string Name
{
get
{
return name;
}
set
{
if(value.length<40)
{
Console.WriteLine("学生姓名长度不能小于4个!");
return;
}
name=value;
}
}
#region
static void Main(string[ ] args)
{
Student student=new Student();
student.Name=Console.ReadLine();
}
}
}
属性(property)
-充分体现了对象的封装性:不直接操作类的数据内容,而是通过访问器进行访问,即借助于get和set对属性的值进行读写;另一方面还可以对数据的访问属性进行控制(当然也可以通过对普通域加readonly关键字来实现。
-设计原则:属性封装了对域的操作。把要访问的域设为private,通过属性中的get和set操作对域进行设置或访问。
-不能把属性作为引用类型或输出参数来进行传递。
-get方法没有参数;set方法有一个隐含的参数value。除了使用了abstract修饰符的抽象属性,每个访问器的执行体中只有分号“;”外,其他的所有属性的get访问器都通过return来读取属性的值,set访问器都通过value来设置属性的值。
-采用间接方式来访问对象的属性(间接调用get、set方法):对象.属性 = 值(调用set),变量 = 对象.属性(调用get)。
-在属性的访问声明中:
只有set访问器,表明该属性是只写的。
只有get访问器,表明该属性是只读的。
既有set访问器,又有get访问器,表明该属性是可读可写的。
private string s_filename;
public string Filename
{
get
{
return s_filename;
}//get
set
{
if(s_filename!=value)
{
s_filename = value;
}//if
}//set
}//Filename
}
l 属性和字段的比较:
Ø 属性不能使用ref/out 型参数
Ø 属性使用前必须赋值
属性使用前必须赋值,例如:
Time lunch;
lunch.Hour = 12;//错误,lunch没有初始化
属性vs.函数
l 相似点
Ø 都包含执行代码
Ø 都可以有访问修饰符
Ø 都可以有virtual, abstract, override 修饰符
Ø 都可以用在接口中
l 不同点
Ø 属性只能拥有get/set 语句
Ø 属性不可以是void 型
Ø 属性不能使用参数
Ø 属性不能使用[ ] 参数
Ø 属性不能使用括号
public int Hour
{
...
set
{
if (value < 0 || value > 24)
throw new ArgumentException("value");
hour = value;
}
类的属性称为智能字段,类的索引器称为智能数组。
由于类本身作数组使用,所以用
this作索引器的名称,索引器有索引参数值。例:
using System;
using System.Collections;
class MyListBox
{
protected ArrayList data = new ArrayList();
public object this[int idx] //this作索引器名称,idx是索引参数
{
get
{
if (idx > -1 && idx < data.Count)
{
return data[idx];
}
else
{
return null;
}
}
set
{
if (idx > -1 && idx < data.Count)
{
data[idx] = value;
}
else if (idx = data.Count)
{
data.Add(value);
}
else
{
//抛出一个异常
}
}
}
}
}
尽可能编写出运行效率更高,更健壮,更容易维护的C#代码。
尽可能的使用属性(property),而不是数据成员(field)。
private int property1
public int Property1
{
get
{
return property1 ;
}
set
{
if (value>1) //这里校验
property1= value ;
else
property1=1;
}
}
//实例属性,可读可写
public int StrCount
{
get
{
return m_strCount;
}
set
{
if (value>m_strCount)
{
strArray = new string[value];
for (int i=0;i<value;i++)
{
strArray[i] = String.Format("String No.{0}",i);
}
m_strCount = value;
}
}
}
private static string m_strName = "MyClass";
//一个静态属性,只读
public static string ClassName
{
get
{
return m_strName;
}
}
class B
{
private A _a;
public A item
{
get
{
if(_a=null)
_a=new A();
return _a;
}
set{_a=value;}
}
}
转载于:https://www.cnblogs.com/zxx193/archive/2013/03/20/2970553.html
C#属性详解及属性与函数间的对比相关推荐
- CSS3中的圆角边框属性详解(border-radius属性)
实例 向 div 元素添加圆角边框: div { border:2px solid; border-radius:25px; } 页面底部有更多实例. 浏览器支持 IE Firefox Chrome ...
- JavaScript Function.arguments 属性详解
转载自 JavaScript Function.arguments 属性详解 arguments属性是正在执行的函数的内置属性,返回该函数的arguments对象.arguments对象包含了调用 ...
- 一些实用博客的分享(ES6详解,echart属性详解)
推荐一个ES6的学习博客(阮老师的ES讲解) 大家如果是学习ES6的话,强烈推荐下面这个阮老师的讲解,都是对比分析,比较清楚易懂!!! 博客地址:http://es6.ruanyifeng.com/# ...
- css background-attachment属性详解
css background-attachment属性详解 background-attachment属性用途 background-attachment属性用于设置背景图片定位的参照方式 backg ...
- java rollback_Spring中的@Transactional(rollbackFor = Exception.class)属性详解
序言 今天我在写代码的时候,看到了.一个注解@Transactional(rollbackFor = Exception.class),今天就和大家分享一下,这个注解的用法: 异常 如下图所示,我们都 ...
- background属性详解
background属性详解 background属性主要由以下5个属性组成, background-color::规定要使用的背景颜色 background-image:规定要使用的背景图像 bac ...
- vue-router的routes中属性详解
一.代码展示 const router = new Router({mode: 'history',base: process.env.BASE_URL,routes: [{path: '/',com ...
- 开启子进程的两种方式、进程间内存空间隔离、进程对象的方法或属性详解
1.操作系统(推荐查看书籍:现代操作系统) 操作系统是位于计算机硬件与软件之间的控制程序 作用: 1.将硬件的复杂操作封装成简单的接口,给用户或者应用程序使用 ...
- android平台下OpenGL ES 3.0实例详解顶点属性、顶点数组
OpenGL ES 3.0学习实践 android平台下OpenGL ES 3.0从零开始 android平台下OpenGL ES 3.0绘制纯色背景 android平台下OpenGL ES 3.0绘 ...
最新文章
- File 类型的文本框,选择文件时响应很慢解决方法
- 云炬Android开发笔记 2-3Android Studio如何导入Github上的项目
- 2018年不能错过的 14 个 Java 库
- 计算机信息处理工具教案设计,《信息和信息处理工具》教案设计
- 签证计算机专业敏感吗,签证中最常见被check的14个敏感专业
- 教您在Excel中批量生成二维码
- 编程算法题:101个数字,[1,100]中有一个是重复的,找出这个重复的数字。
- 免费企业邮箱: Google企业邮箱的申请
- 计算机玩游戏特别卡,Win7电脑游戏卡顿怎么办 win7玩游戏卡如何解决
- 汇编启蒙题--by cyl老师
- 基于STM32的多功能门禁系统(AS608指纹识别、密码解锁、刷卡解锁)
- 输入年龄,判断年龄阶段
- Linux监控平台搭建Zabbix(资源)
- python ABCD 选项蒙题游戏
- 关闭word/ppt后自动创建并打开新的文档
- 郎意难坚,侬情自热(文/王路)
- Enterprise Library 4.1数据访问应用程序块快速入门【6】使用DataSet更新数据库
- Ubuntu根目录结构说明
- we learn怎么刷时间_怎么在其他平台做Shopify独立站营销
- 可能host文件被修改,导致有些网址无法访问(正规)
热门文章
- Python:数据类型
- leetcode —— 877. 石子游戏
- tensorflow第十一步CNN表情识别
- 张正友标定Opencv实现、标定流程以及图像坐标转为世界坐标
- MySQL之EXPLAIN(索引优化)
- php调用谷歌翻译,PHP调用谷歌翻译 | 学步园
- 天正暖通天圆地方在哪_2020位于太白山景区海拔3511米天圆地方景点就变成了很多人望而却步的地方_天圆地方-评论-去哪儿攻略...
- python可视化库matplotlib_Python数据可视化matplotlib库
- java jedis_Java操作Redis之Jedis用法详解
- 引入springcloud报错。common依赖找不到_微服务架构:spring cloud之服务注册和服务发现...