在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. 产品 线上 保持 和 支持 服务 (Support and maintenance solutions)

    Maintenance and support are the key factors for the smooth functioning of ERP solutions. ERP mainten ...

  2. .NET中Redis安装部署及使用方法简介

    一Redis服务端以服务方式运行 修改端口压缩文件中配置的是6488 修改密码 修改库的数量 工具配置安装后如下图 二Redis服务端以控制台方式运行 第一步配置本地服务 第二部安装和配置客户端 三C ...

  3. BroadcastReceiver.PendingResult类别

    java.lang.Object android.content.BroadcastReceiver.PendingResul 类概述 状态的结果正在等待一个广播接收器.在BroadcastRecei ...

  4. 浅谈JavaScript中的柯里化函数

    首先,不可避免的要引经据典啦,什么是柯里化函数呢(from baidu): 在计算机科学中,柯里化(Currying)是把接受多个参数的函数变换成接受一个单一参数(最初函数的第一个参数)的函数,并且返 ...

  5. swiftSingleton模式

    swift在几个方面Singleton模式: 1. 全局变量 private let _singleton = Singleton() class Singleton: NSObject { clas ...

  6. linux_删除空文件(大小等于0的文件)的方法

    1: 查看 find . -name "*" -type f -size 0c 2:删除 find . -name "*" -type f -size 0c | ...

  7. 我们的空间是它圆——基于Poicare对宇宙的模型

    一般 状态 在人类文明的开始,并探讨了空间和时间的混乱从来没有停止过.马跑得更快.鱼下潜深.鸟振翅高飞,但是,人类并没有很深的不满潜飞不高.为什么?其原因是,马跑得更快,但它不会不知道他们为什么会跑得 ...

  8. Gaea是支持跨平台具有高并发、高性能、高可靠性,并提供异步、多协议、事件驱动的中间层服务框架

    Gaea是支持跨平台具有高并发.高性能.高可靠性,并提供异步.多协议.事件驱动的中间层服务框架 Gaea:58同城开源的中间层服务框架 https://github.com/58code/Gaea 中 ...

  9. openfire修改服务器名称方法

    1.登陆openfire管理页面,在主页面下方选择编辑属性,修改服务器名称为当前主机名称,点击保存属性,按页面提示重启服务器. 2.重启后,主页的服务器属性下的服务器名称出现一个叹号,鼠标放上去显示F ...

  10. C语言 链表

    原文:C语言 链表 最近在复习数据结构,想把数据结构里面涉及的都自己实现一下,完全是用C语言实现的. 自己编写的不是很好,大家可以参考,有错误希望帮忙指正,现在正处于编写阶段,一共将要实现19个功能. ...