【C#】C#中的属性与字段
目录结构:
在这篇文章中,将会详细介绍属性(Property)。属性总的分为两种,一种是有参属性(索引器),另一种是无参属性。
1.属性和字段的区别
属性(Property)和字段(Field)想必读者都是见到过的,他们的区别见如下代码:
class Person {
public String m_name;//字段
public Int32 m_age;
public String Name{//属性
get { return m_name; }
set { m_name = value; }//关键字value代表新值
}
public Int32 Age {
get {return m_age;}
set {m_age = value;}
}
}
从上面的定义的Person类可以看出,通常,封装了字段访问的方法就是访问器(属性)。严格的说,属性是方法。
2.无参属性
无参属性就是如同上面的Person类中的属性,无索引器。
2.1 自动实现的属性
C#为无参属性提供了一种更简便的语法,称为自动实现属性(Automatically Implemented Property 简称为API)。
例如:
class Person {
public String Name{set;get;}
public Int32 Age{get;set;}
}
上面C#会自动为Name和Age属性声明字段,并且也会自动实现Name和Age属性的主体方法,分别设置和返回字段中的值。
2.2 对象和集合初始化器
经常要构造一个对象,并设置对象的一些公共属性(或字段),C#简化了这个常见的编程模式。
还是以上面的Person类举例,在有了Person类中,我们就可以声明对象和初始化值一步完成(通过无参构造器):
Person person = new Person() { Name="jame",Age=};
如果属性实现了IEnumerable或是IEnumerable<T>接口,那么属性就会被认为是集合,例如:
class Classroom {
public List<String> Student { set; get; }
}
然后可以就使用如下的代码完成创建Classroom对象并且初始化Student属性值。
Classroom classroom = new Classroom() { Student = { "green","red","blue"} };
知道了上面的知识后,我们就可以创建集合对象与赋值一步完成,例如:
List list=new List<String>{"a","b"};
2.3 匿名类型
C#可以利用匿名类型来声明不可变(immutable)的元组类型。一旦类型声明完成后,就不可以更改。
例如:
var o1 = new {Name="jame",Age=,Sex="男" };
//o1.Name = "231";//编译不通过,因为Name是只读属性。
Console.WriteLine(o1.Name);//jame
Console.WriteLine(o1.Age);//
Console.WriteLine(o1.Sex);//男
上面的代码,C#自动创建一个匿名类型,并且含有Name、Age、Sex的只读属性。
通过上面的代码可以看出,C#提供匿名类型的语法是:
var o=new {perperty1=expression1,...,perpertyN=expressionN};
C#会推断每个表达式的类型,并且创建类型的私有字段,为每个字段创建公共只读属性,并且创建一个构造器来接受所有这些表达式。
2.4 System.Tuple类型
这里介绍一下System.Tuple类型,因为System.Tuple类型中的所有属性都是只读的。System.Tuple有好几个泛型版本,区别在于他们的元数(泛型参数的个数)。
//最简单的泛型Tuple类型
[Serializable]
public class Tuple<T1>{
private readonly T1 m_Item1;
public T1 Item1 { get { return m_Item1; } }
public Tuple(T1 item1) {
m_Item1 = item1;
}
}
//最复杂的泛型Tuple泛型类型
[Serializable]
public class Tuple<T1, T2, T3, T4, T5, T6, T7, TRest>{ private readonly T1 m_Item1;
private readonly T2 m_Item2;
private readonly T3 m_Item3;
private readonly T4 m_Item4;
private readonly T5 m_Item5;
private readonly T6 m_Item6;
private readonly T7 m_Item7;
private readonly TRest m_Rest; public T1 Item1 { get { return m_Item1; } }
public T2 Item2 { get { return m_Item2; } }
public T3 Item3 { get { return m_Item3; } }
public T4 Item4 { get { return m_Item4; } }
public T5 Item5 { get { return m_Item5; } }
public T6 Item6 { get { return m_Item6; } }
public T7 Item7 { get { return m_Item7; } }
public TRest Rest { get { return m_Rest; } } public Tuple(T1 item1, T2 item2, T3 item3, T4 item4, T5 item5, T6 item6, T7 item7, TRest rest) {
m_Item1 = item1;
m_Item2 = item2;
m_Item3 = item3;
m_Item4 = item4;
m_Item5 = item5;
m_Item6 = item6;
m_Item7 = item7;
m_Rest = rest;
}
}
Tuple类从System.Object派生,并且实现了IStructuralEquatable, IStructuralComparable接口,它们的是可比较的。
栗子:
static void Main(string[] args)
{
Tuple<Int32, Int32> vals = MinMax(,);
Console.WriteLine(vals.Item1);//
Console.WriteLine(vals.Item2);//
Console.ReadLine(); }
static Tuple<Int32, Int32> MinMax(Int32 a, Int32 b) {
return new Tuple<int, int>(Math.Min(a,b),Math.Max(a,b));
}
3.有参属性
我们将属性的get访问器是否能接受参数,分为无参属性和有参数属性(索引器)。
CLR本身是不区分有参属性和无参属性的。对CLR来说,每个属性只是类型定义的一对方法和元数据。不同的编程语言使用使用了不同的语法来创建有参属性,C#使用this[...]作为表达器索引的语法,因此C#只支持在对象的实例上定义索引器。
例如:
class BitArray {
private Byte[] m_byteArray;
private Int32 m_numBits;
public BitArray(Int32 numBits) {
//验证实参
if (numBits <= )
throw new ArgumentException("numBits must be > 0");
//保存位的个数
m_numBits = numBits;
//为位分配字节
m_byteArray=new Byte[(numBits+)/];//之所以要加7,因为即使位数小于8,也应该有一个字节。
}
//下面是索引器(有参属性)
public Boolean this[Int32 bitPos] {
get {
if (bitPos < || bitPos >= m_numBits) {
throw new ArgumentException("bitPos");
}
return (m_byteArray[bitPos/]&(<<(bitPos%)))!=;//判断下标(bitPos%8)位的值是否不是0
}
set {
if (bitPos < || bitPos >= m_numBits)
{
throw new ArgumentException("bitPos");
}
if (value)
{
//将指定索引处的位设置为true
m_byteArray[bitPos / ] = (Byte)(m_byteArray[bitPos / ] | ( << (bitPos % )));//将下标(bitPos%8)位的值设置为1
}
else {
//将指定索引处的位设置为false
m_byteArray[bitPos / ] = (Byte)(m_byteArray[bitPos / ] & ~( << (bitPos % )));//将下标(bitPos%8)的位的值设置0
}
}
}
}
然后就可以像如下这样来使用BitArray的索引器了。
BitArray ba = new BitArray();
//调用set访问器,将所有偶数位都设置为true
for (Int32 x = ; x < ; x++) {
ba[x]=(x%==);
}
//调用get访问器,显示所有位的状态。
for (Int32 x = ; x < ; x++) {
Console.WriteLine("Bit "+x+" is "+(ba[x]?"On":"Off"));
}
4.属性的可访问性
有时希望为get访问器方法提供一个可访问性,为set访问器方法指定另一种可访问器。
例如:
public class SomeType{
private String m_name;
public String Name{
get{return m_name;}//默认
protected set{m_name=value;}//指定为protected
}
}
【C#】C#中的属性与字段的更多相关文章
- Java中的属性与字段的区别
Java中属性和字段的区别 Java中的属性,通常可以理解为其属名性时根据get和set方法名得出的. 其规则是:去掉get或set后其剩余的字符串,如果第二个字母是小写的,则把第一个字母也变成小写 ...
- C#中对属性和字段的理解
字段 C#中很少提到全局变量的概念, 引入了字段一词来代替全局变量, 但也并不是这样简单的, 字段会比全局变量的使用更难理解, 使用上会简单, 初学者当做成员变量或者全局变量不会有什么影响, 随着使用 ...
- 基础知识系列☞C#中→属性和字段的区别
"好吧...准备写个'基础知识系列',算是记录下吧,时时看看,更加加深记忆···" 其实本来准备叫"面试系列"... 字段.属性.你先知道的哪个概念? ***我 ...
- 黑马程序员--C#中属性和字段(变量)的区别
---------------------- ASP.Net+Android+IOS开发..Net培训.期待与您交流! ---------------------- 属性为类提供了一种很有用的封装数据 ...
- spring data mongodb中,如果对象中的属性不想加入到数据库字段中
spring data mongodb中,如果对象中的属性不想加入到数据库字段中,可加@Transient注解,声明为透明属性 spring data mongodb 官网帮助文档 http://ww ...
- 尚硅谷面试第一季-11MyBatis中当实体类中的属性名和表中的字段名不一样怎么办
问题: MyBatis中当实体类中的属性名和表中的字段名不一样 ,怎么办 ? 解决方案: 1.写sql语句时起别名 <!-- id属性:必须是接口中方法的方法名 resultType属性:必须是 ...
- C#中属性和字段的区别
属性和字段的区别 在C#中,我们可以非常自由的.毫无限制的访问公有字段,但在一些场合中,我们可能希望限制只能给字段赋于某个范围的值.或是要求字段只能读或只能写,或是在改变字段时能改变对象的其他一些状态 ...
- Java:集合,对列表(List)中的自定义对象按属性(字段)排序(正序、倒序)的方法
1. 要求 对列表(List)中的自定义对象,要求能够按照对象的属性(字段)进行排序(正序.倒序). 如:用户对象(Member)有用户名(username).级别(level).出生日期(birth ...
- Dapper中数据表的字段(列)与实体属性不一致时,如何手动配置它们之间的映射?
NET[C#]Dapper中数据表的字段(列)与实体属性不一致时,如何手动配置它们之间的映射? 问题描述 比如有如下的数据表结构:Person: person_id int first_name va ...
随机推荐
- 深入了解Activiti工作流流程定义
深入了解Activiti工作流流程定义 2016-03-27| 发布: | 浏览: 2363 |保存PDF 部署流程定义 部署流程定义的流程: 1. 先获取流程引擎对象:在创建时会自动加载 class ...
- BZOJ1036 [ZJOI2008]树的统计Count 树链剖分
欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ1036 题意概括 一个树,每个节点有一个权值.3种操作. 1:修改某一个节点的权值. 2:询问某两个 ...
- BZOJ1801 [Ahoi2009]chess 中国象棋 动态规划
欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ1801 题意概括 在N行M列的棋盘上,放若干个炮可以是0个,使得没有任何一个炮可以攻击另一个炮. 请 ...
- 【Java】 剑指offer(23) 链表中环的入口结点
本文参考自<剑指offer>一书,代码采用Java语言. 更多:<剑指Offer>Java实现合集 题目 一个链表中包含环,如何找出环的入口结点?例如,在图3.8的链表中, ...
- 009 搭建Spark的maven本地windows开发环境以及测试
在看完下面的细节之后,就会发现,spark的开发,只需要hdfs加上带有scala的IDEA环境即可. 当run运行程序时,很快就可以运行结束. 为了可以看4040界面,需要将程序加上暂定程序,然后 ...
- 是否可从一个static方法内发出对非static方法的调用?
不可以.因为非static方法是要与对象关联在一起的,必须创建一个对象后,才可以在该对象上进行方法调用,而static方法调用时不需要创建对象,可以直接调用.也就是说,当一个static方法被调用时, ...
- cordova 5.4版本 适配全面屏 底部黑边问题
在全面屏发布之后,Android官方提供了适配方案,即提高App所支持的最大屏幕纵横比,实现很简单,在AndroidManifest.xml中可做如下配置: 更改android.max_aspect值 ...
- dns 安全
域名系统组织架构 DNS是全球互联网中最重要的基础服务之一,也是如今唯一的一种有中心点的服务.全球域名系统组织与管理架构如下图所示: ICANN 互联网名称与数字地址分配机构(The Interne ...
- 3d角色模型 制作 全过程 。3d max 。3d role model making process.3d Max
3d角色模型 制作 全过程 .3d max 3d role model making process.3 d Max 作者:韩梦飞沙 Author:han_meng_fei_sha 邮箱:313134 ...
- bzoj4337: BJOI2015 树的同构 树哈希判同构
题目链接 bzoj4337: BJOI2015 树的同构 题解 树哈希的一种方法 对于每各节点的哈希值为hash[x] = hash[sonk[x]] * p[k]; p为素数表 代码 #includ ...