C#中的属性-Property
C#的属性一直都有用,但具体了解的不是很深,而且一些注意事项也没有太在意过,糊里糊涂的用着。这两天看了C#的书专门学习了一下属性,这才知道,原来属性也有这么多东西~ ~今天记录一下,算是对学习的一个检验吧。 属性的本质是方法,是字段的封装形式,对外界提供字段的访问功能,避免外界直接接触到字段,有点经纪人的意思。属性包含两个访问器,一个是get,一个是set,通过get访问器外界可以通过属性获取相应的字段的值;通过set访问器,外界可以传递值给set访问器默认包含的变量value,来更改字段的值。属性的定义很简单,如下:
private int _num;
public int Num{
get
{
return this._num;
}
set
{
this._num = value;
}
}
PS:为了区分字段与属性,字段的命名通常以下划线“_”开头。 除了上面这种格式的属性,C#还提供了一种书写更加简单的属性,称为自动属性,自动属性最大的特点就是省去了字段的声明(C#自动帮你做了),而且get和set访问器不包含方法体,只用一个";"结尾,for example:
public int Num
{
get;
set;
}
是不是简化了不少?而且使用起来和普通的属性一样。 通过上述的两种格式,外界可以对字段进行读写,但是有的时候我们可能只想开放一部分功能,比如只读或者只写。实现属性的只读或者只写,C#提供了两种方式:
通过隐藏get或者set访问器来实现只读或者只写。example:
private int _num;
// 只读属性
public int Num{
get{
return this._num;
}
}
// 只写属性
public int Num{
set{
this._num = value;
}
//自动属性的只读:
public int Num{
get;
}
}
PS:对于自动属性而言,必须包含get访问器,所以无法通过隐藏get访问器来实现只写属性
通过给get和set访问器添加访问修饰符来实现属性的只读或者只写。example:
private int _num;
public int Num{
//只写
private get
{
}
set
{
this._num = value;
}
}
public int Num{
//只读
private get
{
return this._num;
}
private set
{
}
}
//自动属性
public int Num{
//只写
private get;
set;
}
public int Num{
//只读
get;
private set;
}
note: 属性在通过给访问器添加访问修饰符来实现只读或着只写功能时,get和set访问器必须同时存在,而且访问器的访问修饰符的限制一定要大于属性的访问修饰符,例如:Num的访问修饰符为Public,那访问器的访问修饰符限制就要比属性的大,所以可以为private或者protected,但不可以是public。
属性的只读和只写的功能实现就写到这了,下面说一下属性的初始化。属性的初始化,也包含两种方法,一种是通过构造函数,另一种则是在声明的时候进行初始化。第一种方法,都很熟悉,和字段的初始化一样。这里说一下第二种,因为我也是第一次见到这种写法,先上代码:
public int Num{get; set;} = int.MaxValue;
需要注意的是,只有自动属性可以使用这种初始化方式,普通的属性不可以这样初始化。
属性的特性内容差不多就这些了,下面说一下属性在接口中的使用。接口中允许包含的内容有:属性、方法、事件和索引器,而属性在接口中的使用,有点类似自动属性,但是没有访问修饰符修饰,具体的访问修饰符根据派生类的需求进行选择。example:
interface IHuman{
int Age{get; set;}
}
class Man:IHuman{
public int Age{get; set;}
}
是不是和自动属性很像,不同的是,接口中的属性可以通过省略get来实现只读属性,而自动属性不可以这么做。
属性的使用,除了接口或者类中之外,有的时候还会出现在结构体中。具体的使用都和上述一样,但有一点需要注意:结构体可以在不使用new进行定义的情况下使用,但是上面我们已经说过了,属性的本质是方法,所以在不是使用new进行定义的情况下,调用属性是会出现编译错误的,这个一定要切记。 好了,该睡觉去了。
PS:以上均是自己学习之后理解所写,水平有限难免会出现错误之处,总是唯恐给阅读到小伙伴造成误导,所以希望能够以质疑的态度去浏览,也希望小伙伴能够批评指出,共同成长。
C#中的属性-Property的更多相关文章
- Objective-C 在Categroy中创建属性(Property)
Objective-c中category是不能直接创建属性的,这时候我们要用到Objc的runtime来实现 用到的方法有两个 一个是get方法 一个set方法 //get方法objc_getAsso ...
- 【整理】Object-C中的属性(Property)的Setter:assign,copy,retain,weak,strong之间的区别和联系
iOS编程过程中,经常看到一些属性前面有些修饰符,比如copy,retain等. 这些关键字,是Object-C语言中,对于Property的setter. Mac官网: The Objective- ...
- Python: 浅淡Python中的属性(property)
起源:项目过程中需要研究youtube_dl这个开源组件,翻阅其中对类的使用,对比c#及Delphi中实现,感觉Python属性机制挺有意思.区别与高级编程语言之单一入口,在类之属性这一方面,它随意的 ...
- WPF样式中TargetType 属性 (Property) 和 x:Key 属性 (Attribute)
如第一个示例所示,如果将 TargetType 属性设置为 TextBlock 而不为样式分配 x:Key,样式就会应用于所有 TextBlock 元素.这种情况下,x:Key 隐式设置为 {x:Ty ...
- Object的属性property详细解释(自动生成成员变量)
类Class中的属性property: 在ios第一版中,我们为输出口同时声明了属性和底层实例变量,那时,属性是oc语言的一个新的机制,并且要求你必须声明与之对应的实例变量,例如: @interfac ...
- Spring依赖注入的方式、类型、Bean的作用域、自动注入、在Spring配置文件中引入属性文件
1.Spring依赖注入的方式 通过set方法完成依赖注入 通过构造方法完成依赖注入 2.依赖注入的类型 基本数据类型和字符串 使用value属性 如果是指向另一个对象的引入 使用ref属性 User ...
- iOS中属性Property的常用关键字的使用说明
属性关键字的作用 现在我们iOS开发中,基本都是使用ARC(自动引用计数)技术,来编写我们的代码.因此在属性property中我们经常使用的关键字有strong,weak,assign,copy,no ...
- <s:property="a" value=""/>取的<s:debug></s:debug>中的value stack中的属性值
<s:property="a" value=""/>取的<s:debug></s:debug>中的value stack中 ...
- Objective-C中变量采用@property的各个属性值的含义
我们在OC中定义变量,可以自己来定义变量的setter方法来设置变量值,用getter方法来获取变量值.但是当变量数量增多时,还采用手动添加setter/getter方法来操作变量,就会使得程序代码量 ...
随机推荐
- IDEA 2019.1版本 永久激活(假装是永久激活,其实还是有时间的,不过这个时间比较长)
先下载 一个 jar 包 链接: https://pan.baidu.com/s/12eC8OZzMrUve2xC7aRUKLQ 提取码: bavi 将下载下来的jar包,放置你安装idea的目录的b ...
- python中的pyc和pyo文件和__pyc__文件夹
一.命令生成 pyc 文件 *.py:源码文件,由 Python 程序解释. *.pyc:源码经编译后生成的二进制字节码(Bytecode)文件. *.pyo:优化编译后的程序,也是二进制字节码文件. ...
- 题解 noip2019模拟赛Day1T3
题面 运河计划 问题描述 水运在人类的交通运输史中一直扮演着重要的角色.借助河流.的便利,人们得以把大量的货物输送到天南海北不仅仅是自然界现成的河流,人工开凿的运河(如苏伊士运河.巴拿马运河.我国的京 ...
- HDU 6060 - RXD and dividing | 2017 Multi-University Training Contest 3
/* HDU 6060 - RXD and dividing [ 分析,图论 ] | 2017 Multi-University Training Contest 3 题意: 给一个 n 个节点的树, ...
- C++Error2208:...尝试引用已删除的函数
C++Error2208:…尝试引用已删除的函数在使用自己编写的类实例化c++stl容器vector时,调用了vector.erase()方法,结果编译器报了以下错误 错误 C2280 “(类名):: ...
- CSS测试题Ⅱ
1.如何使用 CSS3 强制换行? A. word-wrap: break-word; B. text-wrap: break-word; C. text-wrap: force; D. text-w ...
- Mac中iterm2显示彩色
Mac中iterm2显示彩色 2016年08月23日 18:09:37 Sun7_She 阅读数:1974 参考网址:https://segmentfault.com/q/101000000065 ...
- git避免提交本地配置文件-来自同事的分享
在项目协作中,对于已经更改的文件,不同的开发者常常需要根据自己的需要对文件进行更改已满足本地开发环境的需求(这种情况很常见,一般是对项目相关的配置项的更改,对业务逻辑代码的更改一般都是正常的协作编码过 ...
- 腾讯域名防封 微信/QQ域名检测,域名防封的原理
微信屏蔽网页的依据是什么?明面上的原因是网页内容有诱导.诈骗等不和谐的内容时候,被用户举报就会封闭.实际上这只是表面现象,因为我们能明确的感受到不同的阶段,同样的内容,被封杀的频率差别很大的,也就是说 ...
- Sqlite3错误:Recursive use of cursors not allowed 的解决方案
感悟] 写完这篇日志后,有调了一段时间程序,又有了一点心得分享下: 一)爬稳定的数(dong)据(xi)最好存储下来,特别是数据库在国外的那种,下载时间成本太高昂了,存起来再处理,会节约很多时间: 二 ...