在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的更多相关文章

  1. C#部分---arraylist集合、arraylist集合中的object数据转换成int类string类等;间隔时间的表示方法;

    ArrayList和Array的区别: 相同点:1.两者都实现了IList.ICollection.IEnumerable接口:       2.两者都可以使用证书索引访问集合中的元素,包括读取和赋值 ...

  2. Java中list<Object[]>、list<Student>、list<Map<String,String>>排序

    1:list<Object[]>的排序   public static void main(String[] args) { // TODO Auto-generated method s ...

  3. java中Object转换成int或String类型方法

    转载: http://www.cnblogs.com/1020182600HENG/p/6137206.html Object obj = getObject(); if(obj instanceof ...

  4. Java中 如何把Object类型强转成Map<String, String>类型

    首先你需要保证要转换的Object的实际类型是Map<String, String> 假设Object变量名为obj,强制转换(Map<String, String>)obj ...

  5. Unable to cast object of type 'System.String' to type 'System.Int32'.

    原因 数据库中 code 字段 类型为 varchar 而实体的类型为 int  导致string 类型无法转化为int 类型而报错 public int code { get; set; } 参考: ...

  6. Struts2接受参数的几种类型和接受复杂类型参数(list<String>和list<Object>)

    Struts2接受参数的几种类型 大概有这几种类型: 1.使用Action的属性接受参数 在Action中加入成员变量,配置Getter和Setter方法,Getter而和Setter方法的名字和表单 ...

  7. 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 ...

  8. StringBuilder.AppendFormat(String, Object, Object) 方法

    将通过处理复合格式字符串(包含零个或零个以上格式项)返回的字符串追加到此实例. 每个格式项都替换为这两个参数中任意一个参数的字符串表示形式. 说明: public StringBuilder Appe ...

  9. 使用xadmin更新数据时,报错expected string or bytes-like object

    expected string or bytes-like object 期望的字符串或类似字节的对象,一般为数据类型不匹配造成 本人在实际项目里发现的问题是: 数据库里的字段类型与django里mo ...

随机推荐

  1. AngularJS html5Mode与ASP.NET MVC路由共存

    前言 很久之前便听说AngularJS,非常酷,最近也比较火,我也在持续关注这个技术,只是没有认真投入学习.前不久公司找我们部门做一个OA系统(想省下几万大洋的费用),第一时间便想到AngularJS ...

  2. 于 jsp第横梁list数据

            往往我们都会将查询到的数据显示到界面中,那么该怎样在界面显示.请看以下的具体解释:     0)前提得在jsp页面中获取后台传过来的数据(在此为List集合):             ...

  3. 动态传递参数到DevExpress.XtraReports的小结

    原文:动态传递参数到DevExpress.XtraReports的小结 前两种方法和WinForm一样,可以传递参数.数组.实体对象.DataTable等1. 采用构造函数具体用法:在Report中p ...

  4. HTML5 Introduction

    1. HTML5 History HTML4.01 –1999.12 HTML5 – 2014.10– Done (8 years) In2006, WHATWG&W3C, decide to ...

  5. POJ 2502 Subway (Dijkstra 最短+建设规划)

    Subway Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 6689   Accepted: 2176 Descriptio ...

  6. Android学习----异常(2):Please ensure that adb is correctly located at &#39; ... &#39;

    打开任务管理器,在后台进程中找到 kadb,结束这个进程,重新启动eclipse.

  7. Cocos2d-x数据持久-变更数据

    当数据变化,参与SQL报表insert.update和delete声明.这项3个月SQL语句可以带参数. 详细过程的数据,例如,下面的变化看出.(1) 采用sqlite3_open开放式数据库功能.( ...

  8. CentOS采用grub进 single状态

    当系统文件错误,有可能无法进入系统.或者您忘记了原来的系统password. 用这种方法可以,进single状态,编辑系统启动文件或更改的错误password. 1.重新启动系统. 2.按" ...

  9. android studio 添加到项目库中的项目

    工程-对-new module-Android Library-module name和package name 它应该在同一个库被引入. 然后在该文件夹replace新的library 在gradl ...

  10. 1_BLE nRF51822 UART 与 BLE转发

    去年Noridc出了集成蓝牙4.0并能开口说话24L01通信芯片,这部电影可以非常小包装.和低功耗.非常适合于可穿戴设备,然后挖了一个免费的手在不久的将来AK II,又没了一个Becon的板子.先玩了 ...