C#语言中字段和属性相关知识剖析
针对C#中的字段和属性,很多初学者无法区分这两者之间的区别。
字段与属性比较
字段;是一种“成员变量”,一般在类的内部做数据交互使用,占用内存空间。
属性:a.是一种逻辑变量,一般跟字段一起结合起来使用,是字段的扩展,并不占用实际的内存。
b.属性其实就是外界访问私有字段的入口,属性本身不保存任何数据。在面向对象设计中主要使用属性描述对象的静态特征。
c.属性设置过程中一般会用到get和set两个方法。可以在方法里加入逻辑处理数据,灵活拓展使用。
标注:因为属性不占用实际内存,所以属性不能用于方法的ref类型参数
下面举个栗子,如下所示
public Class Student
{
private DateTime _Birthday;
private string _Name;
public string Name
{
get{return _Name;}
set {this._Name=value;}
}
public int Age
{
get {return DateTime.Now.Year-this._Birthday.Year}
}
}
在这个例子中,_Name是字段,而Name为属性,Name属性的get方法为返回学生的姓名,Set方法则是对_Name字段进行赋值。
Age也是类中的一个属性,只不过这个属性是只读属性,get方法返回格式化之后的年龄数据,这就是使用属性很好的控制了返回数据的格式,不然还得专门写个方法去格式化数据。
同时,属性也可以通过相应的条件对字段赋值进行相应的限制,比如我们要限定Student的名字长度最长不能超过5个字,超过5个字的,我们就只截取前面5个字符即可。
为了实现这种效果,我们可以在set方法内做逻辑规则运算,即可轻松实现想要的效果,如下所示,设置Name属性为:
Public string Name
{
get {return _Name}
set
{
if(value.Length>5)
this._Name=value.Substring(0,5);
else
this._Name=value;
}
}
直接对字段赋值是无法达到上述效果,你需要在每次给字段赋值的时候,调用函数获取理想值。使用属性可以完美避免非法数据。
使用属性的情况:
- 要求字段只能读或者只能写;
- 需要限制字段的取值范围;
- 在改变一个字段的值的时候希望改变对象的其它一些状态;
使用字段的情况:
- 允许自由读写;
- 取值范围只受数据类型约束而无其他任何特定限制;
- 值的变动不需要引发类中其它任何成员的相应变化。
最后,附上我的ASP.NET学习群,欢迎各位同行入群指导交流。技术群:【.NET技术社区】872894940
更多文章可以关注博主个人站点:IT技术小趣屋。
C#语言中字段和属性相关知识剖析的更多相关文章
- C语言中预处理器的相关知识:
预处理过程时,会做以下事情或着更多: 将所有的#define删除,并且展开所有的宏定义: 处理所有条件编译指令,如#if,#ifdef等: 处理#include预编译指令,将被包含的文件插入到该预编译 ...
- C#中字段、属性、只读、构造函数赋值、反射赋值的相关
C#中字段.属性和构造函数赋值的问题 提出问题 首先提出几个问题: 1.如何实现自己的注入框架? 2.字段和自动属性的区别是什么? 3.字段和自动属性声明时的直接赋值和构造函数赋值有什么区别? 4.为 ...
- IL角度理解C#中字段,属性与方法的区别
IL角度理解C#中字段,属性与方法的区别 1.字段,属性与方法的区别 字段的本质是变量,直接在类或者结构体中声明.类或者结构体中会有实例字段,静态字段等(静态字段可实现内存共享功能,比如数学上的pi就 ...
- 不允许修改SQLserver2008r2表中字段的属性问题
SQLserver2008r2修改表中字段的属性时弹出 点击工具->选项,取消阻止保存要求重新创建表的更改
- Java中字段、属性、成员变量、局部变量、实例变量、静态变量、类变量、常量
首先看个例子: package zm.demo; public class Demo { private int Id;//成员变量(字段).实例变量(表示该Id变量既属于成员变量又属于实例变量) p ...
- 《Python网络编程》学习笔记--从例子中收获的计算机网络相关知识
从之前笔记的四个程序中(http://www.cnblogs.com/take-fetter/p/8278864.html),我们可以看出分别使用了谷歌地理编码API(对URL表示地理信息查询和如何获 ...
- C语言学习笔记--C语言中变量的属性关键字
变量属性关键字的使用语法:property type var_name; 1.auto 关键字 auto关键字是C语言中局部变量的默认的关键字,C编译器默认所有的局部变量都是auto的,它表明了被修饰 ...
- 用人类社会工程学对C语言中的一些基本概念的剖析与理解
最近在学C语言程序设计时总是遇到一些概念理解上的不清晰与混乱的地方,在一次偶然间想到了以前看过的一部电影<我是谁,没有一个系统是安全的>,里面的主角用社会工程学的想法结合黑客知识化险为夷, ...
- 学习一下 JVM (二) -- 学习一下 JVM 中对象、String 相关知识
一.JDK 8 版本下 JVM 对象的分配.布局.访问(简单了解下) 1.对象的创建过程 (1)前言 Java 是一门面向对象的编程语言,程序运行过程中在任意时刻都可能有对象被创建.开发中常用 new ...
随机推荐
- 关于整数溢出和NaN的问题
当Integer i = Integer.MAX_VALUE;i + 1 < i成立, Double.NaN与任何数(包括自己)比较都为false,与js的NaN一样 如下: //整数溢出 In ...
- html、css基础整理
1.块元素与行内元素之间的转换: HTML可以将元素分类方式分为行内元素.块状元素和行内块状元素三种.这三者是可以互相转换的,使用display属性能够将三者任意转换: (1)display:inli ...
- OC基础成员变量、属性变量、实例方法与类方法
首先,为什么我们要定义一个新类呢?按照我的理解,就是为了抽象出来一个新的东西(也就是类),用来存储更多的数据变量和方法,一切类都直接或间接继承与NSObject. 在类的头文件里我们可以定义成员变量. ...
- 服务器windows2008系统登录报错:由于远程桌面服务当前正忙,因此无法完成您尝试的任务。请在...
1.问题描述:windows server 2008服务器通过远程桌面登录时很慢,登录不进去,把远程桌面关掉后,再用远程桌面登录时,出现下图提示. 把服务器接上显示器键盘鼠标后,卡在系统登录的欢迎界面 ...
- 转Centos7.0进入单用户模式修改root密码
Centos7.0进入单用户模式修改root密码 启动Centos7 ,按空格让其停留在如下界面. 按e进行编辑 在UTF-8后面输入init=/bin/sh 根据提示按ctrl+x 得如下图 输 ...
- autium designer 软件使用:
1mil=0.0254mm 1,英文输入法A建,对齐方式. 2,焊盘,过孔区别 作为安装孔时,焊盘和过孔在内孔覆铜上有区别,焊盘的内控通过设置属性可以没有覆铜,而过孔不可以.如果选中焊盘属性Adv ...
- JS canvas 画板 撤销
<!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content ...
- Senparc.Weixin SDK v5.0 升级公告
经过五年半的持续维护,Senparc.Weixin SDK 逐步丰满和完善,在升级的过程中,我们为基础库(Senparc.Weixin.dll)加入了许多通用的功能,例如加密/解密算法.通用缓存方法等 ...
- Javascript高级编程学习笔记(15)—— 引用类型(4)RegExp类型
JS中处理字符串最常用的应该就是正则了 同样正则(RegExp)类型也是JS中引用类型的一种 ECMAScript通过 RegExp类型 来支持正则表达式 创建正则 var expression = ...
- Python面向对象4:类的相关函数与属性
1 类相关函数- issubclass:检测一个类是否是另一个类的子类- isinstance:检测一个对象是否是一个类的实例- hasattr:检测一个对象是否由成员xxx- getattr: ge ...