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()仍然比较的是变量的 “内容” 是否一样。
C# Attribute特性 泛型<T> 方法的out ref this(扩展方法) Equals与==的更多相关文章
- c#静态扩展方法,字典的克隆扩展方法
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...
- 译:泛型List集合转化为DateTable的扩展方法
译文出处:http://www.codeproject.com/Tips/867866/Extension-Method-for-Generic-List-Collection-to-Da 这段代码是 ...
- ..net 3.5新特性之用this关键字为类添加扩展方法
具体用法如下: public static class ClassHelper { //用this 声明将要吧这个方法附加到Student对象 public static bool CheckName ...
- 扩展方法 1 简单的string扩展方法
这里是关于 String的简单扩展方法 (静态类 静态方法 this 类型 这里是string) static class Program { static void Main(string[] ar ...
- 之前采用的是Helper类的方法重构时改用了扩展方法
在手机端输入网址不方全,通常会将网址做成一个二维码,然后用手机扫一下就可以打开预览.我们每改一下样式,就在手机上点一下刷新或电脑上按一下F5,这在最初的时候,也不觉得有什么问题,因为拿到我手上的静态页 ...
- 用LinQ扩展方法,泛型扩展方法,实现自定义验证字符是否空、对象是否为null,及泛型约束使用,Action的使用
一.Linq扩展方法 1.扩展方法必须是静态方法.扩展方法所在的类必须是静态类 2.扩展方法里面的参数必须制定this关键字,紧跟需要扩展的类型,如下: 二.泛型约束 1.使用泛型的原因,是在不知道需 ...
- C#的扩展方法解析
在使用面向对象的语言进行项目开发的过程中,较多的会使用到“继承”的特性,但是并非所有的场景都适合使用“继承”特性,在设计模式的一些基本原则中也有较多的提到. 继承的有关特性的使用所带来的问题:对象的继 ...
- C# 知识回顾 - 扩展方法解析
在使用面向对象的语言进行项目开发的过程中,较多的会使用到“继承”的特性,但是并非所有的场景都适合使用“继承”特性,在设计模式的一些基本原则中也有较多的提到. 继承的有关特性的使用所带来的问题:对象的继 ...
- [读书笔记]C#学习笔记五: C#3.0自动属性,匿名属性及扩展方法
前言 这一章算是看这本书最大的收获了, Lambda表达式让人用着屡试不爽, C#3.0可谓颠覆了我们的代码编写风格. 因为Lambda所需篇幅挺大, 所以先总结C#3.0智能编译器给我们带来的诸多好 ...
随机推荐
- serialVersionUID作用是什么以及如何生成的?
目录 正常不设置serialVersionUID 的序列化和反序列化 序列化之后,类文件增加了字段,反序列化会怎么样? 指定serialVersionUID,减少或者增加字段会发生什么? serial ...
- 手把手教你使用Vue/React/Angular三大框架开发Pagination分页组件
DevUI是一支兼具设计视角和工程视角的团队,服务于华为云DevCloud平台和华为内部数个中后台系统,服务于设计师和前端工程师.官方网站:devui.designNg组件库:ng-devui(欢迎S ...
- BYTE WORD DWORD
在Visual C++ 6.0中,BYTE与WORD,DWORD本质上都是一种无符号整型,它们在WINDEF.H中被定义,定义如下:typedef unsigned char BYTE;t ...
- MacBook键盘锁定、按键失效、无反应等问题
目录 MacBook按键无反应 u,i,o,j,k,l等键失灵 capslock灯不亮 原文链接:joselynzhao·CSDN·MacBook键盘锁定.按键失效.无反应等问题 MacBook按键无 ...
- 20190814_tomcat配置项目的错误页
1. 打开项目中的web.xml, 注意不是tomcat的web.xml; 一般是在项目的 WEB-INF目录下, 然后加上下面的语句 <error-page> <error-cod ...
- Java虚拟机之内存区域
原创文章,转载请标明出处! 目录 一.背景 二.运行时内存区域概述 1.官方描述 2.中文翻译 3.内存区域简述 4.运行时数据区简图 5.运行时数据区详图 三.JVM线程 JVM数据区域与线程关系 ...
- 转:浅析windows下字符集和文件编码存储/utf8/gbk
最近老猿在学习文件操作及网络爬虫相关知识,发现字符集及编码的处理非常重要,而老猿原来对此了解并不多,因此找了几篇文章看了一下,将老猿认为比较的相关文章转载一下.感谢各位原创大神! 1,字符集 这里主要 ...
- Nessus破解没有Scan选项的解决办法
如图,安装之后无Scan选项,流程按照吾爱破解上的文章:https://www.52pojie.cn/thread-1140341-1-1.html 解决办法为: 首先nessus.license在安 ...
- 剑指offer二刷——数组专题——构建乘积数组
构建乘积数组 题目描述 给定一个数组A[0,1,...,n-1],请构建一个数组B[0,1,...,n-1],其中B中的元素B[i]=A[0]*A[1]*...*A[i-1]*A[i+1]*...*A ...
- logstash导入DNS解析数据到es中,中间有filebeat
这个过程中,主要用logstash处理数据的时候不好处理. 在logstash-sample.conf这个配置文件中的配置,我用这个监控filebeat的5044端口 # Sample Logstas ...