c#中关于String、string,Object、object,Int32、int
在java中,string和String有着明显的区别,后者就是前者的一个封装。在c#中,好像是通用的,大部分情况下,两者互换并不会产生问题。今天特意查了一下资料,了解了一下两者的关系。
简单的讲,String指的是System.String类别,而string则是C#内建的关键字。事实上,string正是对应到System.String类别,也可说string是System.String 类别在C#中的化名(alias),因此对两者的应用会生成相同的IL码,对於CLR而言这两者是没什么差别的。
再具体一些,就要从内建类型(Predefined Type)谈起了。 内建类型,又称做原生类型(Primitive Type),顾名思义就是一个语言内建的类型。也就是说,一个符合该语言标准的编译器,应该要能直接支援这种类型。一般来讲,这意味著该语言应该会为该类型规范出一个语言关键字,而编译器要能认得这个关键字并在编译时产生适当代码。以C#来说,像是整数(int),浮点数(float),字符串(string)等都是内建类型,我们可以直接使用这些关键字,而C#编译器将能看懂这些关键字并编译出适当的IL码供执行之用。通过这样的方式会方便我们进行编码。比如要用一个变数来储存年龄时,是
int age = 20;
还是
System.Int32 age = new System.Int32();
age = 20;
毕竟整数,浮点数,字元,字串等在程序中实在太常用了。如果每次都来一行
System.Int32 age = new System.Int32();
实在麻烦。此外,内建类型也意味著编译器在设计时就已经了解这些类型的实作细节,所以编译器对于内建类型可以有更多的识别方法,因而能更有弹性且有力的处理这些类型。举例来说,在使用内建类型时我们可以不用new来new去,一行
int i = 10;
就通通搞定。而在将精度较低的内建类型转型至精度较高的内建类型时我们可以不需多做指示地让它隐式转型(Implicit cast):
int i = 20;
double j = i;
当然,这和派生类别能自动向上转型(upcast)为基类别的情况并不一样,因为int并不是继承double而来,他们都是继承自System.ValueType,换言之,在继承体系之中,他们俩是平行的。此例之中int之所以能自动地转型成double乃是因为编译器知道int和double这两个内建类型是做什么用的,并判断出可以无害的将int转型为double,因此能顺利编译过关且正常运作。
那么,到底要String还是string呢 现在,我们应该已经知道什么叫内建类型,也了解到String和string到最後都是一样的,因为这两种程式码都会产生相同的IL码。那么,我们到底应该使用哪种风格来写程式呢 在C#语言规格书1.2.1中是这样说的:「As a matter of style, use of the keyword is favored over use of the complete system type name.」很明显地它的建议是使用关键字。不过相反的主张也有人支持,基本精神是认为使用FCL名称会使程式较为清楚,因为同一个FCL类型在不同语言也许会使用不同的别名(alias),或是相同的别名在不同的程式语言中可能会对应到不同的FCL类型,使用FCL名称可以避免必须使用多种语言工作或不熟悉此语言的程式设计师产生混淆。举例来说,如果程式中是清清楚楚的宣告成Int32,那无庸置疑地这个变数就是Int32。但若是宣告为long,那在某些语言可能是对应到Int32,有些则是对应到Int64。基本上,我个人是觉得两种风格间没有明显优劣差异,所以依喜好择一即可,唯一的建议是:最好不要混用。混用会导致程式风格混乱,在阅读和维护上都有可能造成困扰。
c#中关于String、string,Object、object,Int32、int的更多相关文章
- C#部分---arraylist集合、arraylist集合中的object数据转换成int类string类等;间隔时间的表示方法;
ArrayList和Array的区别: 相同点:1.两者都实现了IList.ICollection.IEnumerable接口: 2.两者都可以使用证书索引访问集合中的元素,包括读取和赋值 ...
- Java中list<Object[]>、list<Student>、list<Map<String,String>>排序
1:list<Object[]>的排序 public static void main(String[] args) { // TODO Auto-generated method s ...
- java中Object转换成int或String类型方法
转载: http://www.cnblogs.com/1020182600HENG/p/6137206.html Object obj = getObject(); if(obj instanceof ...
- Java中 如何把Object类型强转成Map<String, String>类型
首先你需要保证要转换的Object的实际类型是Map<String, String> 假设Object变量名为obj,强制转换(Map<String, String>)obj ...
- Unable to cast object of type 'System.String' to type 'System.Int32'.
原因 数据库中 code 字段 类型为 varchar 而实体的类型为 int 导致string 类型无法转化为int 类型而报错 public int code { get; set; } 参考: ...
- Struts2接受参数的几种类型和接受复杂类型参数(list<String>和list<Object>)
Struts2接受参数的几种类型 大概有这几种类型: 1.使用Action的属性接受参数 在Action中加入成员变量,配置Getter和Setter方法,Getter而和Setter方法的名字和表单 ...
- statsmodels.tsa.arima_model预测时报错TypeError: int() argument must be a string, a bytes-like object or a number, not 'Timestamp'
在 python 中用 statsmodels创建 ARIMA 模型进行预测时间序列: import pandas as pd import statsmodels.api as sm df = pd ...
- StringBuilder.AppendFormat(String, Object, Object) 方法
将通过处理复合格式字符串(包含零个或零个以上格式项)返回的字符串追加到此实例. 每个格式项都替换为这两个参数中任意一个参数的字符串表示形式. 说明: public StringBuilder Appe ...
- 使用xadmin更新数据时,报错expected string or bytes-like object
expected string or bytes-like object 期望的字符串或类似字节的对象,一般为数据类型不匹配造成 本人在实际项目里发现的问题是: 数据库里的字段类型与django里mo ...
随机推荐
- jsp 行动标签
jsp行动标签 签.它影响JSP执行时的功能. 1.include动作标签 <jsp:include page="文件名称字"/> 或 <jsp:include ...
- 控制执行流程——(Java学习笔记三)
if-else 控制程序流程最基本的形式 格式: if(boolean - expresion){ statement } 或 if(boolean - expresion){ stateme ...
- oracle11g的dmp文件导入oracle10g当误差:头验证失败---解决
原创作品,离 "深蓝的blog" 博客.欢迎转载,转载时请务必注明出处.否则追究版权法律责任. 深蓝的blog:http://blog.csdn.net/huangyanlong/ ...
- mysql只导出表结构或数据
唯一的非导电结构指南数据 mysqldump -t 数据库名称 -uroot -p > xxx.sql 指南结构不仅指导数据 mysqldump --opt -d 数据库名 -u -p ...
- Eclipse UML 工具 ObjectAid 介绍
概要 本文介绍如何使用 ObjectAid(http://www.objectaid.com/) UML Explorer 创建 UML 图,高速阅读代码. 安装 ObjectAid ObjectAi ...
- UVA 10870 - Recurrences(矩阵高速功率)
UVA 10870 - Recurrences 题目链接 题意:f(n) = a1 f(n - 1) + a2 f(n - 2) + a3 f(n - 3) + ... + ad f(n - d), ...
- projecteuler---->problem=19----Counting Sundays
You are given the following information, but you may prefer to do some research for yourself. 1 Jan ...
- Linux_下安装MySQL
linux下mysql 最新版安装图解教程 1.查看当前安装的linux版本 命令:lsb_release -a 如下图所示 通过上图中的数据可以看出安装的版本为RedHat5.4,所以我们需要下载R ...
- java编程接口(5) ------ button和button组
这篇文章是由自己的学习笔记,欢迎转载,但请注明出处:http://blog.csdn.net/jesson20121020 了解了布局管理器和Swing事件模型,那么剩下的就是Swing 的各个组件了 ...
- HTML的标签canvas
定义和使用方法 <canvas> 标签定义图形,比方图表和其它图像. <canvas> 标签仅仅是图形容器,您必须使用脚本来绘制图形. 实例 怎样通过 canvas 元素来显示 ...