C# Attribute特性 泛型<T> 方法的out ref this(扩展方法) Equals与==

out ref

out和ref的使用场景其实不一样。out适合在方法内返回一个额外的结果参数,而ref适合直接改变一个在方法外面的值,方法改变外部就改变,无需重新定义接住返回值再使用。

out可以在方法内部返回多个不同类型的参数

out必须在调用时声明需要返回的参数,并传入形参(其实相当于传入一个形参)

out参数必须在方法内部赋值不然返回的就是空,并且会报语法错误
out返回时可以不用写return

ref使用时需要在外部必须赋值
并且调用时候声明ref
方法内也声明ref
作用:无需返回值,只需在方法内外都声明ref,值将会跟随同步改变

ref和out的异同:
同:1.在调用时候都必须传入关键字,方法内部也必须写入关键字
2.都必须在外部声明需要改变的值
3.都无需return返回,只要调用方法,值就改变可以使用了。

异:1.ref必须在调用的方法外部进行赋值 out必须在方法内部赋值

public void Start()
    {
        //outSum没必要赋值,赋值了也完全没用。
        //如果AddByOut函数内部直接使用out对应的参数,会报错:使用了未被赋值的 out 参数a
        int outSum = 1;
        int ov1 = 2;
        int ov2 = 3;
        AddByOut(out outSum, ov1, ov2);
        Console.WriteLine("outSum : " + outSum + "  v1: " + ov1 + "   v2: " + ov2);


        //refSum 必须赋值
        int refSum = 1;
        int rv1 = 2;
        int rv2 = 3;
        //如果refSum没有赋值,这里会报错:使用了未赋值的局部变量 refSum
        AddByRef(ref refSum, rv1, rv2);
        Console.WriteLine("refSum : " + refSum + "  v1: " + rv1 + "   v2: " + rv2);
    }

    public void AddByOut(out int a, int b, int c)
    {
        //a = a + b + c;// a 未被赋值,不能直接使用,即使是调用的地方 out对应的参数初始化也没用
        a = b + c;
    }

    public void AddByRef(ref int a, int b, int c)
    {
        a = a + b + c; // 可以直接使用a
    }

this 关键字

 

 Attribute

一,什么是特性
特性也是一种对象,关键字是 Attribute,特殊之处在于其编译时就存在了,也就是在程序运行之前就存在了。

特性(Attribute)是用来 向程序添加声明性信息。一个声明性标签是通过放置在它所应用的元素前面的方括号([ ])来描述的。
特性(Attribute)用于添加元数据,如编译器指令和注释、描述、方法、类等其他信息。所以要获取某个类的特性,需要通过反射实现

二,是用特性的类必须继承 Attribute
先给段简单代码玩一下

     public class student
        {
            [ColumnAttribute("Uname")]  //这里就是调用了,去掉中括号,实际就是构造函数调用
            public string Name { get; set; }
        }
 
        public class ColumnAttribute : Attribute  
        {
            public string Name { get; private set; }
            
            public ColumnAttribute(string name)
            {
                this.Name = name;
            }
        }

泛型

优点:
1.使用泛型类、方法,我们可以极大提高代码的重用性,不需要对类型不同代码相同(仅类型参数不同)的代码写多次。
2.创建泛型类,可在编译时创建类型安全的集合
3.避免装箱和拆箱操作降低性能,在大型集合中装箱和拆箱的影响非常大.

使用泛型后对象或者集合内只能放入指定的数据类型,避免出现对象或者集合内的对象在多态使用的时候出现类型转换异常(java.lang.ClassCastException),可以保证对象或者集合的安全性。
指定了类型后,对象、集合或方法内只能使用对应的类型,可以减少类型的转换操作(在没有指定类型是类型转换必须使用 instanceof 关键字来进行判定),缩减了代码了,方便了程序员。

经常会遇到功能非常相似的模块,只是它们处理的数据不一样。但我们没有办法,只能分别写多个方法来处理不同的数据类型。这个时候,那么问题来了,有没有一种办法,用同一个方法来处理传入不同种类型参数的办法呢?泛型的出现就是专门来解决这个问题的。

Equals 与== 的区别

对于值类型来说,Equals与==两者比较的都是“内容”是否相同,即值是否一样,很显然此时两者是同一个意思。
对于引用类型来说,==(等号)比较的是两个变量的“引用” 是否一样,也就是比较引用的“地址”是否相同。而equals()仍然比较的是变量的 “内容” 是否一样。

原文地址:https://www.cnblogs.com/netlock/p/13552498.html