为什么string是引用类型 值还不可以修改

C#把数据类型分为值类型和引用类型。值类型操作简单,引用类型更省空间。

C#一共有15个预定义类型,其中13个值类型(8个整型、2个浮点类型、decimal、bool、char),2个引用类型(string、object)。

仔细看,值类型都是空间使用较小的类型,引用类型都是空间使用较大的类型(如string、我们自己声明的类)。

string 因为空间使用大概率较大,所以被作为引用类型。但是如果和一般的引用类型的赋值操作一样,那么容易被在不需要改动的情况下修改。

所以,微软给了折中的办法,每次值的变更,都会给出一个新的地址给变量。原来的地址还是原来的值,自己的修改不影响别人。

这样,string既有引用类型的性能,又有值类型的便捷。

原文地址:https://www.cnblogs.com/wangliuwei/p/11129767.html

时间: 2024-11-25 14:59:57

为什么string是引用类型 值还不可以修改的相关文章

.net中String是引用类型还是值类型 以及 C#深层拷贝浅层拷贝

http://www.cnblogs.com/yank/archive/2011/10/24/2204145.html http://www.cnblogs.com/zwq194/archive/2012/08/06/2625403.html 关于String为值类型还是引用类型的讨论一直没有平息,最近一直在研究性能方面的问题,今天再次将此问题进行一次明确.希望能给大家带来点帮助. 如果有错误请指出. 来看下面例子: //值类型 int a = 1; int b = a; a = 2; Cons

javascript检测基本类型值或引用类型值的类型方法

首先javascript的数据类型分为两种数据类型:基本数据数据类型和引用数据类型 基本数据类型:Number,String,Boolean,Undefined,Null.原始值,是简单的数据段,可按值访问,直接操作保存在变量中的实际值 引用数据类型:Object,Array,Function,Date,RegExp,单体内置对象(Math,window(客户端才有的全局对象),global(服务端才有的全局对象)).引用值,是保存在栈内存中的对象,是有多个值构成的对象,与其他语言不同的是:你不

Linux重启inotify配置max_user_watches无效被恢复默认值8192的正确修改方法

Linux下Rsync+inotify-tools实现数据实时同步中有一个重要的配置就是设置Inotify的max_user_watches值,如果不设置,当遇到大量文件的时候就会出现出错的情况. 一般网上修改方法就是直接修改文件: /proc/sys/fs/inotify/max_user_watches 或者修改方法: sysctl -w fs.inotify.max_user_watches="99999999" 但是这些修改后,Linux系统重启inotify配置max_use

c# 值类型与引用类型 值传递与引用传递

值类型与引用类型: 值类型 :1.值类型大小固定.存储在栈上.  2.不能继承,只能实现接口 3.派生自valuetype int double char float byte bool enum struct decimal 引用类型:1.在栈上存储了一个地址实际存储在堆中,大小不固定. 2.数组.类.接口.委托 string 数组 类 接口 委托 值传递与引用传递: 值类型按值传递.值类型按引用传递.引用类型按值传递.引用类型按引用传递. 值传递:默认传递都是值传递 ,把栈中内容拷贝一份引用

C# 数据类型 数组,引用类型 值类型

1 /*C#语法基础 2 * 1.C#程序是从Main方法开始执行.要求Main方法的返回值类型为void或int ,而且要么不带参数,要么接受一个字符串数组作为参数.当返回值是int的是状态吗,标志程序是否执行成功,返回非 3 * 0值通常意味着错误: 4 * 2.类型:是具有相似特征和行为的个体的分类: 5 * 3.一次赋值返回一个值,所以C#允许在同一条语句中连续进行多个赋值操作: 6 * 4.基元类型:8中整数类型,2种二进制浮点类型,1种金融计算的额十进制浮点类型,1种布尔类型,1种字

课堂随笔02--c#中string作为引用类型的特殊性

using System; namespace Test { class Test1 { static void Main(string[] args) { string str1 = "123"; string str2 = str1; str1 = "456"; Console.WriteLine(str2);//应该输出 123 Console.ReadLine(); } } } 按上边代码输出,按照引用类型的定义,str1 赋值给 str2,则当str1 变

leetcode_49题——Anagrams(string,hashtable,还用到了算法sort,迭代器)

Anagrams Total Accepted: 33531 Total Submissions: 137666My Submissions Question Solution Given an array of strings, return all groups of strings that are anagrams. Note: All inputs will be in lower-case. Hide Tags Hash Table String Have you met this

关于基本类型值和引用类型值以及Vue官方API的array.$remove(reference)

今天又是孟哥解惑. 数组里的元素也是指向内存地址么? 这个要分情况的. 无论a[0],a[2]在什么地方,只要其值是基本类型值,就是值的比较,只要其值是引用类型(对象),就是内存地址的比较. Vue官方API:http://cn.vuejs.org/api/#array-_24remove_28reference_29,有个例子array.$remove(reference),参数是对象时,完全没问题,对于基本值,需要再测一下.保险起见,可以用array.splice(index, 1)方法,然

为什么 string.find()返回值是-1

之前好像在哪里见到过这个问题,时间有点久,想不起来了,今天写字符串又碰到这个问题,书上给出的定义是当string.find()没有找到时返回的是一个非常大的值,网上有人说是-1,两种说法都对,由于整数在计算机中是依照补码形式存放的,一个高位的整数在少一位的整数表示时假设高位的第二位是1,那么少一位的表示下就是负数,假设高位整数的第二位包含第二位之后全是1,那么在少一位的表示下就是-1.string.find()返回的那个非常大的数是2的32次方,而在用4个字节表示的int,long整形,最多仅仅