值类型与引用类型(特殊的string) Typeof和GetType() 静态和非静态使用 参数传递 相关知识
学习大神博客链接: http://www.cnblogs.com/zhili/category/421637.html
一 值类型与引用类型
需要注意的string 是特殊类型的引用类型.
使用方法: == 比较的是栈里面的值, 值类型比较值, 对象(除字符串)比较的是栈里面的地址.
equal比较的是实际的值,是object里面的虚方法重写,重写时最好重写getHashCode()方法.
如下为代码例子
static void Main(string[] args)
{
object m1 =1 ;
object m2 = 1;
Console.WriteLine(m1==m2); // False;因为比较的是引用,肯定不是同一个对象.
Console.WriteLine(m1.Equals(m2)); //True. 因为比较的是对象对应的值.
Console.Read();
}
例子2:
static void Main(string[] args)
{
string str1 = "ZhangSan";
string str2 = "ZhangSan";
string str3 = new string(new char[] { 'z', 'h' });
string str4 = new string(new char[] { 'z', 'h'});
Console.WriteLine("str1 == str2 " + (str1 == str2).ToString()); //True
Console.WriteLine("str1 Equals str2 " + str1.Equals(str2));//True Console.WriteLine("str3 == str4 " + (str3 == str4).ToString());//True
Console.WriteLine("str3 Equals str4 " + str3.Equals(str4)); //True. Console.Read();
} //总结: 因为string重写了==方法.用于比较值.
二 Typeof 和 GetType() 区别
- typeof 是运算符,而 GetType() 是方法
- typeof 获得类型的System.Type对象,GetType()获得当前实例的Type,
- GetType()是基类System.Object的方法,只有建立了一个实例之后才能够被调用
- typeof的参数只能是int, string, class,自定义类型,不能为具体实例,否则编译器会报错
static void Main(string[] args)
{
object m1 = 1;
object m2 = 1;
// ValueType是引用类型,因为它是类,所以返回为false
Console.WriteLine(typeof(ValueType).IsValueType); //False. ValueType是类!!!
Console.WriteLine(m1.GetType().IsValueType);//Ture
Console.Read();
}
三 静态与非静态.
说的比较透彻的是, 链接: ([C#基础知识系列]全面解析C#中静态与非静态)http://www.cnblogs.com/zhili/archive/2013/06/16/StaticAndNonStatic.html
个人使用总结: 想不实力化类-->创建静态类-->静态属性-->静态成员是private的-->使用静态方法一般用于作为通用的工具类来实现.
文中总结有: 1, 静态方法不能被标识为virtual、abstract或override,静态方法可以被派生访问,但是不能被派生类重写.
2, 构造函数执行过程:
静态成员分配内存空间-->静态成员初始化-->执行静态构造函数-->执行实例成员初始化-->执行实例构造函数
IL 中.ctor代表实例构造器.
四 参数传递
对于按值传递,不管是值类型还是引用类型的按值传递,都是传递实参的一个拷贝.
只是值类型时,此时传递的是实参实例的一个拷贝(也就是值类型值的一个拷贝)
而引用类型时,此时传递的实参引用的副本。
对于按引用传递,传递的都是参数地址,也就是实例的指针.(加ref and out 关键字)
注意: string 是特殊的引用类型. 传递是实际的值,想要方法传递引用, 即外面的值发生改变, 需要加ref out 参数.
最新文章
- 《大型网站系统与Java中间件实践》读书笔记——CAP理论
- Android 笔记 day3
- 如何快速在当前目录打开cmd命令提示符
- 如果正确读取SQL Server中的扩展事件?
- TechEd2013 Shanghai Hol Session PPT Share
- eclipse如何导入项目
- PHPNG (next generation)
- php网页显示正方形图片缩略图
- XSS高级实战教程
- Java Numeric Formatting--reference
- nginx自动切割访问日志
- Sample Page
- jwt token Example - Python
- 微信小程序开发心得--动画机制
- 软件工程(GZSD2015)第二次作业进度
- Vue项目的打包
- bootstrap顶部导航遮挡下面内容的解决办法
- 断路器Ribbon
- Java编程的逻辑 (92) - 函数式数据处理 (上)
- Ubuntu 14.04 安装 Blender,并放桌面
热门文章
- LFI漏洞利用总结(转载)
- Python写的东西在CMD下打印中文
- Python 类型的分类
- C# : 操作Word文件的API - (将C# source中的xml注释转换成word文档)
- Jordan Lecture Note-10: Kernel Principal Components Analysis (KPCA).
- Asp.Net下载页面,并弹出下载提示框
- 解决ajax回调函数无返回值得问题
- css笔记04:属性选择器
- learning nodejs 2 - connect middleware
- python(1) - 第一个程序 Hello World!