【CLR in c#】属性
1.无参属性
1.为什么有字段还需要属性呢?
因为字段很容易写出不恰当的代码,破坏对象的状态,比如Age=-1。人的年纪不可能为负数。使用属性后你可以缓存某些值或者推迟创建一些内部对象,你可以以线程安全的方式来访问字段,字段可能是一个逻辑字段,它的值需要某个方法类计算得到。
属性可以给set,get访问器这只不同的访问权限。
所以推荐将所有字段设置为private类型,当需要用户设置改变时,写成属性的形式。
无参属性的几种写法。
1.最原始的写法,通过方法来赋值,这也是其他简略写法中CLR会自动生成的代码。像这样写不得不实现额外的方法而且在调用的时候会比较麻烦。
- class CLR属性1
- {
- private string name;
- private int age;
- public string GetName() {
- return name;
- }
- public void SetName(string value) {
- name = value;
- }
- public int GetAge() {
- return age;
- }
- public void SetAge(int value)
- {
- if (age < && age > )
- throw new ArgumentOutOfRangeException("age不在正常范围", value.ToString());
- age = value;
- }
- }
2.CLR提供的一种称为属性(property)的机制
- class CLR属性2
- {
- private string name;
- private int age;
- public string Name
- {
- get { return name; }
- set { name = value; }
- }
- public int Age
- {
- get { return age; }
- set
- {
- if (age < && age > )
- throw new ArgumentOutOfRangeException("age不在正常范围", value.ToString());
- age = value;
- }
- }
- }
3.自动实现的属性,
public string Name{set;get;}
属性和字段需要合理的运用。
1,属性可以是只读或只写。字段访问总是可读可写。
2.一个属性方法可能抛出异常,字段访问不会抛出。
3.属性不能用作ref和out参数传递,字段可以。
4,属性方法花费的较长的执行时间,字段的访问则是立即完成。
5,在多次连续调用的情况下,属性可能会返回不同的值,字段每次都返回相同的值,必须DateTime.Now
6,属性方法可能会造成额外的内存,或者不正确的引用,字段返回的总是正确的引用。
2.匿名类型
匿名类型的定义如下:
var o1=new{Name="aa",Year=1989};
Console.WriteLine("Name{0}Year{1}",o1.Name,o1.Year);
使用匿名类型,编译器会自动创建一个类型名称,使用var关键字,让编译器根据赋值操作符(=)右侧的表达式推断类型。
匿名类型在Linq技术中比较常见。
var query=from student in students
let Name=(student.name1+student.name2)
order Name
select new {Path=student,Name};
3,Tuple类型
可以查看一下Tuple类型的定义,其实就是一些泛型参数
public class Tuple<T1>{}//最简单
…………
public class Tuple<T1,T2,T3,T4,T5,T6,T7,TRest>{}//最复杂
下面是Tuple的简单应用
- class CLRTuple
- {
- private static Tuple<int, int> MinMax(int a, int b) {
- return new Tuple<int, int>(Math.Min(a, b), Math.Max(a, b));
- }
- private static void TupleTypes()
- {
- var minmax = MinMax(, );
- Console.WriteLine("Min{0}Max{1}", minmax.Item1, minmax.Item2);
- }
- }
当需要创建多于8个元素的一个Tuple时,可以将Rest参数传递到下一个Tuple如下
var t=Tuple.Create(0,1,2,3,4,5,6,Tuple.Create(7,8));
Console.WriteLine("{0}{1}{2}{3}{4}{5}{6}{7}{8}",t.Item1,t.Item2,t.Item3,t.Item4,t.Item5,,t.Item6
,t.Rest.Item1.Item1,t.Rest.Item1.Item2
)
4,有参属性(索引器)
有参属性就是使用数组风格的语法来公开有参属性(索引器),自己平时用的少,下面发个例子理解一下用法。
- class CLR索引器
- {
- private string[] saveStr;
- public CLR索引器(int num)
- {
- saveStr = new string[num];
- }
- public string this[int index]
- {
- get {
- if (index < )
- throw new ArgumentOutOfRangeException("index", index.ToString());
- return saveStr[index];
- }
- set {
- if (index < )
- throw new ArgumentOutOfRangeException("index", index.ToString());
- saveStr[index] = value;
- }
- }
- }
- CLR索引器 x = new CLR索引器();
- for (int i = ; i < ; i++)
- x[i] = i.ToString();
- for (int i = ; i < ; i++)
- Console.WriteLine(x[i]);
【CLR in c#】属性的更多相关文章
- [CLR via C#]10. 属性
一.无参属性 对于字段,强烈建议将所有的字段都设为private.如果允许用户或类型获取或设置状态信息,就公开一个针对该用途的方法.封装了字段访问的方法通常称为访问器(accessor)方法.访问器方 ...
- MSSQLSERVER添加c# clr程序集的使用方法
前言 MSSQLSERVER提供程序集,无疑可以让编程人员更加便捷的操作数据库数据,比如c#写的函数,可以在数据库当作sql的函数使用,你想想他对不熟悉数据库的程序员来说是有多么的嗨.这么好的机制,大 ...
- 使用 Fluent API 配置/映射属性和类型(摘自微软Data Access and Storage)
使用 Fluent API 配置/映射属性和类型 使用实体框架 Code First 时,默认行为是使用一组 EF 中内嵌的约定将 POCO 类映射到表.但是,有时您无法或不想遵守这些约定,需要将实体 ...
- 使用Fluent API 配置/映射属性和类型
Code First约定-Fluent API配置 使用Fluent API 配置/映射属性和类型 简介 通常通过重写派生DbContext 上的OnModelCreating 方法来访问Code F ...
- 使用 Fluent API 配置/映射属性和类型
使用 Fluent API 配置/映射属性和类型 使用实体框架 Code First 时,默认行为是使用一组 EF 中内嵌的约定将 POCO 类映射到表.但是,有时您无法或不想遵守这些约定,需要将实体 ...
- c#、vb 自动属性
vb示例: Public Property Name() As String = "Bob" 等效于 Private _name As String = "Bob&quo ...
- .NET C#基础(4):属性 - 本质是方法
0. 文章目的 本文面向有一定.NET C#基础知识的学习者,介绍C#中属性的属性.定义.使用方法以及特殊性. 1. 阅读基础 理解C#基本语法(定义类及类成员,调用方法) 认可OOP的封 ...
- 基本术语表【WF】
术语 定义 activity(活动) Windows Workflow Foundation 中的程序行为单元. 可将单个活动组合在一起,形成更复杂的活动. activity action(活动操作) ...
- Entity Framework 5.0 Code First全面学习
摘自:http://blog.csdn.net/gentle_wolf/article/details/14004345 不贴图片了,太累. Code First 约定 借助 CodeFirst,可通 ...
- EntityFramework5.0CodeFirst全面学习
Code First 约定 借助 CodeFirst,可通过使用 C# 或Visual Basic .NET 类来描述模型.模型的基本形状可通过约定来检测.约定是规则集,用于在使用 Code Firs ...
随机推荐
- 未将对象引用设置到对象的实例 启用 JIT 调试后,任何无法处理的异常
严谨!!!! DataSet ds = salarySum.GetDataSalarySum2(libUser.SelectedValue, dtpMonth.Value.Date); ...
- curl命令 抓取网络数据相应头
curl --verbose --data "Password=123&Username=158101068&url=http://m.vancl.com/" & ...
- 项目之solr全文搜索工具之创建项目索引库
以创建项目baotao core为例 1. 在example目录下创建baotao-solr文件夹: 2. 将./solr下的solr.xml拷贝到baotao-solr目录下: 3. 在bao ...
- c语言运算符
一.op=形式的赋值操作符 int a=0; a+=1; //等价于 a=a+1;// a*=1; 二.op=类表达式 int a=10,b=5; a/=b;//等价于a=a/b; a*=b+1; ...
- Spring 注释 @Autowired 和@Resource
一. @Autowired和@Resource都可以用来装配bean,都可以写在字段上,或者方法上. 二. @Autowired属于Spring的:@Resource为JSR-250标准的注释,属于J ...
- OkHttp学习总结
This paper mainly includes the following contents okhttp ordinary operation. okhttp interceptors. Re ...
- MyBatis魔法堂:即学即用篇
一.前言 本篇内容以理解MyBatis的基本用法和快速在项目中实践为目的,遵循Make it work,better and excellent原则. 技术栈为My ...
- JustSniffer
http://blog.csdn.net/cnbird2008/article/details/5875781
- 与你相遇好幸运,Sail.js新建模型控制器
sails generate api user 创建了user的controller和models sails generate api user index 创建了user的controller和 ...
- Java学习笔记(十六)——Java RMI
[前面的话] 最近过的好舒服,每天过的感觉很充实,一些生活和工作的技巧注意了就会发现,其实生活也是可以过的如此的有滋有味,满足现在的状况,并且感觉很幸福. 学习java RMI的原因是最近在使用dub ...