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#】属性的更多相关文章

  1. [CLR via C#]10. 属性

    一.无参属性 对于字段,强烈建议将所有的字段都设为private.如果允许用户或类型获取或设置状态信息,就公开一个针对该用途的方法.封装了字段访问的方法通常称为访问器(accessor)方法.访问器方 ...

  2. MSSQLSERVER添加c# clr程序集的使用方法

    前言 MSSQLSERVER提供程序集,无疑可以让编程人员更加便捷的操作数据库数据,比如c#写的函数,可以在数据库当作sql的函数使用,你想想他对不熟悉数据库的程序员来说是有多么的嗨.这么好的机制,大 ...

  3. 使用 Fluent API 配置/映射属性和类型(摘自微软Data Access and Storage)

    使用 Fluent API 配置/映射属性和类型 使用实体框架 Code First 时,默认行为是使用一组 EF 中内嵌的约定将 POCO 类映射到表.但是,有时您无法或不想遵守这些约定,需要将实体 ...

  4. 使用Fluent API 配置/映射属性和类型

    Code First约定-Fluent API配置 使用Fluent API 配置/映射属性和类型 简介 通常通过重写派生DbContext 上的OnModelCreating 方法来访问Code F ...

  5. 使用 Fluent API 配置/映射属性和类型

    使用 Fluent API 配置/映射属性和类型 使用实体框架 Code First 时,默认行为是使用一组 EF 中内嵌的约定将 POCO 类映射到表.但是,有时您无法或不想遵守这些约定,需要将实体 ...

  6. c#、vb 自动属性

    vb示例: Public Property Name() As String = "Bob" 等效于 Private _name As String = "Bob&quo ...

  7. .NET C#基础(4):属性 - 本质是方法

    0. 文章目的   本文面向有一定.NET C#基础知识的学习者,介绍C#中属性的属性.定义.使用方法以及特殊性. 1. 阅读基础   理解C#基本语法(定义类及类成员,调用方法)   认可OOP的封 ...

  8. 基本术语表【WF】

    术语 定义 activity(活动) Windows Workflow Foundation 中的程序行为单元. 可将单个活动组合在一起,形成更复杂的活动. activity action(活动操作) ...

  9. Entity Framework 5.0 Code First全面学习

    摘自:http://blog.csdn.net/gentle_wolf/article/details/14004345 不贴图片了,太累. Code First 约定 借助 CodeFirst,可通 ...

  10. EntityFramework5.0CodeFirst全面学习

    Code First 约定 借助 CodeFirst,可通过使用 C# 或Visual Basic .NET 类来描述模型.模型的基本形状可通过约定来检测.约定是规则集,用于在使用 Code Firs ...

随机推荐

  1. LightOJ 1234 Harmonic Number

    D - Harmonic Number Time Limit:3000MS     Memory Limit:32768KB     64bit IO Format:%lld & %llu S ...

  2. 【XLL API 函数】xlCoerce

    将 XLOPER/XLOPER12 转换为另一种类型,或是查询表格中的单元格值. 函数原型 Excel12(xlCoerce, LPXLOPER12 pxRes, 2, LPXLOPER12 pxSo ...

  3. 非Unicode工程读取Unicode文件

    MyUnicodeReader.h #pragma once /******************************************************************** ...

  4. W3C对DOM2.0定义的标准事件

    DOM2.0模型将事件处理流程分为三个阶段: 一.事件捕获阶段, 二.事件目标阶段, 三.事件起泡阶段. 具体如图(图片来源于网络,侵删) 事件捕获:当某个元素触发某个事件(如onclick),顶层对 ...

  5. merge

    当两个DataFrame相加的时候,如果,其中一个不全则会相加产生NA,所以必须一次性将数据的索引索引确定下来,然后对所有数据重建索引然后,填充0,再相加.否则有数据的和没数据的相加结果都变为了NA, ...

  6. 消息队列MQ - Apache ActiveMQ

    Apache ActiveMQ是Apache软件基金会所研发的开放源码消息中间件:由于ActiveMQ是一个纯Jave程式,因此只需要操作系统支持Java虚拟机,ActiveMQ便可执行. 1.que ...

  7. 借助LinkedHashMap实现基于LRU算法缓存

    一.LRU算法介绍 LRU(Least Recently Used)最近最少使用算法,是用在操作系统中的页面置换算法,因为内存空间是有限的,不可能把所有东西都放进来,所以就必须要有所取舍,我们应该把什 ...

  8. UVA 10066 The Twin Towers

    裸最长公共子序列 #include<time.h> #include <cstdio> #include <iostream> #include<algori ...

  9. Jquery.Datatables td宽度太长的情况下,自动换行

    在 td 里面 加上 style="word-wrap:break-word;" 自动换行就好了,如果不想换行,可以将超出内容设为隐藏, overflow:hidden; whit ...

  10. 个推+DCLOUD,推送消息和透传消息

    DCLOUD方案中集成了个推方案,最好是用个推来做推送相关的东西 消息分2类: 1.推送消息,这种一般会出现在手机的最上面的通知栏,用户是肯定会知道的 2.透传消息,这种一般就是一个Alert提示框, ...