在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. ruby简单的基本 6

    模 像类似的模块,那里 class method 和 instance method.module 没有new不能生成对象的例子其中 class method 所谓的模块在模块化的方法,它能够直接调用 ...

  2. Do a “git export” (like “svn export”)?(转)

    Probably the simplest way to achieve this is with git archive. If you really need just the expanded ...

  3. android layout物业介绍

    android:id 为控件指定对应的ID android:text 指定控件其中显示的文字,须要注意的是,这里尽量使用strings.xml文件其中的字符串 android:gravity 指定Vi ...

  4. Nlog 配置总结

    Writes log messages to one or more files. Since NLog 4.3 the ${basedir} isn't needed anymore for rel ...

  5. HDOJ 3037 Saving Beans

    如果您有n+1树,文章n+1埋不足一棵树m种子,法国隔C[n+m][m] 大量的组合,以取mod使用Lucas定理: Lucas(n,m,p) = C[n%p][m%p] × Lucas(n/p,m/ ...

  6. ACM算法

      一.数论算法 1.求两数的最大公约数 2.求两数的最小公倍数 3.素数的求法 A.小范围内判断一个数是否为质数: B.判断longint范围内的数是否为素数(包含求50000以内的素数表): 二. ...

  7. NYoj The partial sum problem(简单深搜+优化)

    题目链接:http://acm.nyist.edu.cn/JudgeOnline/problem.php?pid=927 代码: #include <stdio.h> #include & ...

  8. linux_shell_根据网站来源分桶

    应用场景: 3kw行url+\t+html记录 [网站混合] 需要:按照网站来源分桶输出 执行shell cat */*pack.html|awk -F '\t' '{ split($1,arr,&q ...

  9. VC各种方法获得的窗口句柄

    AfxGetMainWnd AfxGetMainWnd获取窗口句柄本身 HWND hWnd = AfxGetMainWnd()->m_hWnd; GetTopWindow 功能:子窗体z序(Z序 ...

  10. HDU 1042 N! 參考代码

    HDU 1042 N! 题意:给定整数N(0 ≤ N ≤ 10000), 求 N! (题目链接) #include <iostream> using namespace std; //每一 ...