[C#] String与string的区别:供参考
转自:https://www.cnblogs.com/rosesmall/p/8351808.html

C#是区分大小写的,但是我却发现C#中同时存在String与string,于是我很困惑,于是我上网搜索了一下,于是我了解了一些小知识。

MSDN中对string的说明:string is an alias for String in the .NET Framework。string是String的别名而已,string是c#中的类,String是Framework的类,C# string 映射为 Framework的 String。如果用string,编译器会把它编译成String,所以如果直接用String就可以让编译器少做一点点工作。
如果使用C#,建议使用string,比较符合规范 。 string始终代表 System.String(1.x) 或 ::System.String(2.0) ,String只有在前面有using System;的时候并且当前命名空间中没有名为String的类型(class、struct、delegate、enum)的时候才代表System.String。

string是关键字,String不是,也就是说string不能作为类、结构、枚举、字段、变量、方法、属性的名称,而String可以。

0. 问题:

1. C#到底是什么时候传引用?什么时候传值?

2. String传值还是传引用

3. string和String有什么区别?

4. String为什么是Immutable,怎么实现的?
以下查询结果以及我的理解:

1. C#到底是什么时候传引用?什么时候传值?
传值的情况 :Struct、Enumeration、Numeric(Integral/Floating/decimal)、bool
传引用的情况:class、Delegate、Interface
当使用操作符"="以及函数传参数的时候: 传值的结果是把原对象复制了一份,接收者指向原对象。 传引用的结果是直接让接收者指向原对象。

有人说,我硬要把值当引用传怎么办?
a、用ref关键字
b、用数组,数组是class
c、凉拌:)

2. String传值还是传引用 C#的String声明是class String,当然是传引用。
不过,之所以有这个疑惑,多数是因为这个情况:
string a = "aaa";
string b = a;
b = "bbb";
或者是这么几行代码:
public void Swap(string s1, string s2)
{
string temp=s1;
s1=s2;
s2=temp;
}
[C#] String与string的区别

这时候结果一打印,结果发现a的值还没有变,Swap也没有成功,这时候就会有幻觉:是不是没有传引用啊?
呵呵,string不会这么粗暴的打乱“声明为class就是传引用”这种规则的。
分析一下:
string a = "aaa"; //==> a----->new String("aaa")
string b = a; //==> b----->a, 传引用
b = "bbb"; //==> b----->new String("bbb"), 传引用,b指向了一个新的字符串,a并没有变。

Swap函数也是这样,比如说传了a, b进去(a="aaa", b="bbb"),
//s1----->a, s2----->b
string temp=s1;//temp----->s1----->a
s1=s2; //s1----->s2----->b;
s2=temp; //s2----->temp----->a
结果是,s1和s2确实是Swap了,但是这种结果并不会影响到a和b
3. string和String有什么区别?
MSDN中对string的说明:string is an alias for String in the .NET Framework
呵呵string是String的别名而已,都是一家。
4. String为什么是Immutable,怎么实现的? immutable:对象一旦生成不可改变
关于怎么实现的,在明白了问题2之后很好办,只要不提供任何修改自己成员变量的方法就可以了。顺便声明为sealed,防止不清楚的后来者违反规定:)
String每个看似修改了成员变量的方法,事实上都返回了一个新的String。
比如String.Replace函数,事实上并没有改变原来的串,这也是为什么只有让str = str.Replace( foo, bar )才真正完成替换的原因。

下面是.NET C# VB.NET IL的类型对应表:
----------------------------------------------------------------
NET C# VB.NET IL 值或引用
System.Boolean bool Boolean bool Value
System.Byte byte Byte unsigned int8 Value
System.Char char Char char Value
System.DateTime - Date - Value
System.Decimal decimal Decimal - Value
System.Double double Double float64 Value
System.Int16 short Short int16 Value
System.Int32 int Integer int32 Value
System.Int64 long Long int64 Value
System.Object object Object object Reference
System.SByte sbyte - int8 Value
System.Single float Single float32 Value
System.String string String string Reference
System.UInt16 ushort - unsigned int16 Value
System.UInt32 uint - unsigned int32 Value
System.UInt64 ulong - unsigned int64 Value
-----------------------------------------------------------------

c# string与String区别的更多相关文章

  1. String、String.valueOf、toString 它们三者的区别总结

    今天在使用这个的时候发现,他们三者好像在某些场所都是可以用的,但是不免会让人想到那既然它们三者这么的相似,那么总有些什么区别吧.我也在网上找了一些资料看.自己也看了API文档,就将他们三的区别总结一下 ...

  2. String详解, String和CharSequence区别, StringBuilder和StringBuffer的区别 (String系列之1)

    本章主要介绍String和CharSequence的区别,以及它们的API详细使用方法. 转载请注明出处:http://www.cnblogs.com/skywang12345/p/string01. ...

  3. C#中string.Empty ,"" , null 区别

    引言 String类型作为使用最频繁的类型之一,相信大家都非常熟悉,对于string赋予空值,通常有以下三种方式: String str1=null; String str2=””; String s ...

  4. C# string[,]与string[][]的区别

    对于这两者的区别: 1.入门:string[,]可读可写,而string[][]与string[]相同,不可对第二位进行写操作 static void Main(string[] args) { // ...

  5. C#中 StringBuilder类 与 String类的区别---(转)

      在找工作的时候,去了些公司,避免不了要面试和笔试.不过一般最起初的是笔试.我印象中有这样有一道题目:StringBuilder类与 String类的区别?那时候我不太清楚这两个类的区别,今天在看代 ...

  6. 转 C#String与string的区别

    C#是区分大小写的,但是我却发现C#中同时存在String与string,于是我很困惑,于是我上网搜索了一下,于是我了解了一些小知识. MSDN中对string的说明:string is an ali ...

  7. String与string的区别(注意大小写)

    在C#编程过程中经常见到string和String,下面来看看它们之间的区别: 1. string是C#中的类, String是.net Framework的类. string是String的别名,S ...

  8. String,StringBuffer,StringBudilder区别--2019-04-13

    String,StringBuffer,StringBudilder区别: 1String 是字符串常量,创建内容不可以变, final修饰意味着String类型不能被继承,减少被修改的可能,从而最大 ...

  9. String StringBuilder StringBuffer区别

    String StringBuilder StringBuffer String类是final类,不可以被继承,且它的成员方法也是final方法,当一个字符串对象进行操作操作时,任何的改变不会影响到这 ...

  10. string与stringBuffer区别

    string 的 “+” 操作就是根据 StringBuilder (或 StringBuffer )类及其 append 方法实现的. String 不可变其实就是说一个 String 对象创建之后 ...

随机推荐

  1. HDU - 2818

    Building Block Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)To ...

  2. IntelliJ IDEA SpringBoot 使用第三方Tomcat以及部署

    花了半天时间终于成功,记录以备查阅. 一.第三方Tomcat部署 部署部分参考的是:把spring-boot项目部署到tomcat容器中 目标:把spring-boot项目按照平常的web项目一样发布 ...

  3. hdu 3367(与最大生成树无关。无关。无关。重要的事情说三遍+kruskal变形)

    Pseudoforest Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Tot ...

  4. Spring.NET学习笔记1——控制反转(基础篇)

    在学习Spring.NET这个控制反转(IoC)和面向切面(AOP)的容器框架之前,我们先来看一下什么是控制反转(IoC). 控制反转(Inversion of Control,英文缩写为IoC),也 ...

  5. 派(Dispatch)

    单派与多派 (Single Dispatch and Multi Dispatch) "检查一个数据项的类型,并据此去调用某个适当的过程称为基于类型的分派". 上面是来自<计 ...

  6. 关于php的session.serialize_handler的问题

    前言 php的session信息是储存在文件中的 session.save_path="" 指定储存的路径 session.save_handler="" 指定 ...

  7. 17-7-20-electron中主进程和渲染进程区别与通信

    老规矩,先吐槽,再记录. 今天被上司教育了将近一个小时.因为之前自动更新的模块,我认为已经完成了,但是还有一些细节没有完善好,就一直一直的被教育~ 事情全部做完,提交以后关闭issue! electr ...

  8. CodeForces 143C Help Farmer

    暴力枚举. 枚举最小的那个数字,不会超过$1000$,剩下的两个数字根号的效率枚举一下即可. #include<bits/stdc++.h> using namespace std; lo ...

  9. RabbitMQ (九) 消息的参数详解

    上篇文章讲了声明一个队列时的参数设置,这篇文章主要说一说发布消息时的参数设置. 发布消息时的完整入参是这样的: channel.BasicPublish ( exchange: "test_ ...

  10. python 字符串,数学之间的不可描述的关系

    首先说一下输入: >>> a=raw_input(" ") 1.234 >>> a '1.234' >>> 可以看到使用raw ...