zoukankan      html  css  js  c++  java
  • 【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 < 0 && age > 200)
                    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 < 0 && age > 200)
                        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(6, 2);
                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 < 0)
                        throw new ArgumentOutOfRangeException("index", index.ToString());
                    return saveStr[index];
                }
                set {
                    if (index < 0)
                        throw new ArgumentOutOfRangeException("index", index.ToString());
                    saveStr[index] = value;
                }
            }
        }
                CLR索引器 x = new CLR索引器(20);
                for (int i = 0; i < 20; i++)
                    x[i] = i.ToString();
                for (int i = 0; i < 20; i++)
                    Console.WriteLine(x[i]);
  • 相关阅读:
    大数据之路Week10_day01 (练习:通过设计rowkey来实现查询需求)
    大数据之路Week10_day01 (通过直接创建Hfile文件的方式往Hbase中插入数据)
    大数据之路Week10_day01 (Hbase总结 II)
    Week09_day05(Java API操作Hbase)
    Week09_day05(Hbase的基本使用)
    Zookeeper、Hadoop、Hbase的启动顺序以及关闭顺序
    Week09_day05(Hbase的安装搭建)
    HDU 1198
    hdu 1250 Hat's Fibonacci(java,简单,大数)
    HDU 1316 How Many Fibs?(java,简单题,大数)
  • 原文地址:https://www.cnblogs.com/m7777/p/4039310.html
Copyright © 2011-2022 走看看