新足迹

 找回密码
 注册

精华好帖回顾

· 实验室面试归来,流水帐(9楼背景调查,20楼offer来了) (2008-10-25) ouyanglimi · 俺家小妞妞是护士 (2015-11-8) hxsh2000
· 女汉子旧房翻新系列二:三个星期时间用了不到一万块翻新老破旧的可爱百年老屋(更新新厨房照片) (2020-7-25) 不是随便的虫虫 · 家乡的云 (2008-9-1) youyuan
Advertisement
Advertisement
123
返回列表 发新帖
楼主:自由的心

弱弱地问一下 C# System.Collection.Generic.List<T> [复制链接]

发表于 2012-1-11 20:57 |显示全部楼层
此文章由 hornsay 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 hornsay 所有!转贴必须注明作者、出处和本声明,并保持内容完整
所以简单地说,你如果只pass string or integer or float, 任何改变在calling function里不会影响到原有的值,但是pass as reference, 任何改变都会影响到原有的值。

但是pass object就不一样了。
持不同股见者...
Advertisement
Advertisement

发表于 2012-1-11 21:04 |显示全部楼层

回复 hornsay 59# 帖子

此文章由 hornsay 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 hornsay 所有!转贴必须注明作者、出处和本声明,并保持内容完整
所以通常我们不把string or integer or float称为object.

所以你会觉得很奇怪,明明string 就是object嘛。

发表于 2012-1-11 21:04 |显示全部楼层
此文章由 无视 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 无视 所有!转贴必须注明作者、出处和本声明,并保持内容完整
原帖由 wil 于 2012-1-11 21:54 发表


Func1:真不是你说的那样。。。Func1(string s),这里发生的事是,s是str引用的copy,所以s和str两个引用同时指向了一个string对象,并不是copy了str的value,当s = null时,s重新指向了null,str还是指向原来的string对象,就是这样 ...


这个是比较清楚的解释,如果再有更加详细的参数push stack的图就更容易理解了。

你手绘一下吧,没有ref和有ref的情况,stack和heap都有的那种。
头像被屏蔽

禁止访问

发表于 2012-1-11 21:11 |显示全部楼层
此文章由 自由的心 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 自由的心 所有!转贴必须注明作者、出处和本声明,并保持内容完整
但是......53楼的情况说明了,用了ref, 即使物理内存中它们的地址不一样,编译器也把 c_param 看成是 c 的 alias, 至少编译器会这样认为认为的,所以当把c_param指向null(或另1个C object),c也同时指向null(或另1个C object)

发表于 2012-1-11 21:14 |显示全部楼层
此文章由 wil 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 wil 所有!转贴必须注明作者、出处和本声明,并保持内容完整
原帖由 hornsay 于 2012-1-11 21:52 发表

在C#出来之前,所有的language(C, C++, Pascal)都是把string, integer,float和object区别开来的,也就是说string不是object, 你不会去new一个string, new 一个integer.

但是现在的C#把所有的东西都归在object里,所以变成string也是属于object, 但它还是有区别的,也就是你不会去new一个string, 所以C#让你confuse了这些东西。


这个。。。。C#出来之前,纯面向对象语言还是很多的,在纯面向语言里所有值,方法等都是对象,java是在C++基础上发展起来的,但还不是纯面向对象语言,为了性能优化还是引入了primitive type等非OO元素,但现代虚拟机可以做很多自动编译优化所以C#从语言层面修正了java这个inconsistent问题,所以不能说“C#让你confuse了这些东西”。。还有面向对象语言只是指令式语言中的一种,指令式语言只是众多编程范式中的一种,说所有的language有点大了
回忆是红色的天空

发表于 2012-1-11 21:20 |显示全部楼层

回复 wil 65# 帖子

此文章由 hornsay 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 hornsay 所有!转贴必须注明作者、出处和本声明,并保持内容完整
我的意思是LZ认为string也是object, 为什么pass string后任何改变不影响到原有的值,而pass object却影响了。
Advertisement
Advertisement

发表于 2012-1-11 21:28 |显示全部楼层
此文章由 wil 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 wil 所有!转贴必须注明作者、出处和本声明,并保持内容完整
原帖由 自由的心 于 2012-1-11 22:11 发表
但是......53楼的情况说明了,用了ref, 即使物理内存中它们的地址不一样,编译器也把 c_param 看成是 c 的 alias, 至少编译器会这样认为认为的,所以当把c_param指向null(或另1个C object),c也同时指向null(或另1个C object)


不纠结物理内存地址问题就好,ref是C#提供的一种语言特性(java所不具备的),但我个人觉得这个特性还是比较危险的,能不用最好不用,调用者允许被调用方法修改自己的对象,这个在纯函数式语言中是严厉禁止的,一个方法产生了side effect,对于程序可读性,测试都带来了很多负面作用,不是现代语言发展趋势,微软现在重点推的F#就是纯函数式语言并引进一些OO语义,也从一定角度表明了函数式语言的价值越来越被重视
回忆是红色的天空

发表于 2012-1-11 21:31 |显示全部楼层
此文章由 wil 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 wil 所有!转贴必须注明作者、出处和本声明,并保持内容完整
原帖由 hornsay 于 2012-1-11 22:20 发表
我的意思是LZ认为string也是object, 为什么pass string后任何改变不影响到原有的值,而pass object却影响了。


C#里的string是object,只不过是immutable object,也可以自己设计immutable class,创建出来的不可变对象和string会有相同的效果
回忆是红色的天空
头像被屏蔽

禁止访问

发表于 2012-1-11 21:43 |显示全部楼层
此文章由 自由的心 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 自由的心 所有!转贴必须注明作者、出处和本声明,并保持内容完整
原帖由 wil 于 2012-1-11 22:31 发表


C#里的string是object,只不过是immutable object,也可以自己设计immutable class,创建出来的不可变对象和string会有相同的效果

C#里的string s是reference-type object,而且是immutable.
C#里的class c, delegate d等等也都是reference-type object, 而且是mutable.
C#里的integer i等等primitive type objects都是value-type objects.

发表于 2012-1-11 21:47 |显示全部楼层
此文章由 hornsay 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 hornsay 所有!转贴必须注明作者、出处和本声明,并保持内容完整
原帖由 wil 于 2012-1-11 22:31 发表


C#里的string是object,只不过是immutable object,也可以自己设计immutable class,创建出来的不可变对象和string会有相同的效果

回了很长贴子,最后才明白LZ纠结在哪里,因为这样的问题应该不是一个问题。 LZ一直纠结在string就是object, 应该behave like object, 但如果以前搞过其它语言,就不会这么纠结。
持不同股见者...
头像被屏蔽

禁止访问

发表于 2012-1-11 21:55 |显示全部楼层
此文章由 自由的心 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 自由的心 所有!转贴必须注明作者、出处和本声明,并保持内容完整
我只关心我自己公司的语言,以后还要学习F#
Advertisement
Advertisement

发表于 2012-1-11 21:56 |显示全部楼层
此文章由 wil 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 wil 所有!转贴必须注明作者、出处和本声明,并保持内容完整
跟微软混吧,微软还是很霸道地
头像被屏蔽

禁止访问

发表于 2012-1-11 22:13 |显示全部楼层
此文章由 自由的心 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 自由的心 所有!转贴必须注明作者、出处和本声明,并保持内容完整
原帖由 wil 于 2012-1-11 22:56 发表
跟微软混吧,微软还是很霸道地

微软里的人都是聪明的不得了

发表于 2012-1-11 22:13 |显示全部楼层
此文章由 hornsay 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 hornsay 所有!转贴必须注明作者、出处和本声明,并保持内容完整
原帖由 自由的心 于 2012-1-11 22:55 发表
我只关心我自己公司的语言,以后还要学习F#

我只关心LZ可不可以帮我加分。。

评分

参与人数 1积分 +2 收起 理由
自由的心 + 2 给学过老语言的同志加分

查看全部评分

持不同股见者...
头像被屏蔽

禁止访问

发表于 2012-1-11 22:14 |显示全部楼层
此文章由 自由的心 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 自由的心 所有!转贴必须注明作者、出处和本声明,并保持内容完整
甚至听说微软有个QA部门特别招聘有特异功能的人,小道消息
头像被屏蔽

禁止发言

发表于 2012-1-11 22:18 |显示全部楼层

你公司用啥语言?

此文章由 iami 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 iami 所有!转贴必须注明作者、出处和本声明,并保持内容完整
原帖由 自由的心 于 2012-1-11 10:55 PM 发表
我只关心我自己公司的语言,以后还要学习F#
签名被屏蔽
Advertisement
Advertisement
头像被屏蔽

禁止访问

发表于 2012-1-11 22:22 |显示全部楼层

回复 iami 76# 帖子

此文章由 自由的心 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 自由的心 所有!转贴必须注明作者、出处和本声明,并保持内容完整
我公司就是微软
头像被屏蔽

禁止发言

发表于 2012-1-11 22:30 |显示全部楼层

突然觉得你很眼熟,在翻翻,原来你就是那位问,能不能在车里听纳粹音乐,还想进口

此文章由 iami 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 iami 所有!转贴必须注明作者、出处和本声明,并保持内容完整
纳粹军服到澳洲来卖的牛人啊。怪不得说话风格似曾相识

原帖由 自由的心 于 2012-1-11 11:22 PM 发表
我公司就是微软
签名被屏蔽

发表于 2012-1-11 22:46 |显示全部楼层
此文章由 Brisun 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 Brisun 所有!转贴必须注明作者、出处和本声明,并保持内容完整
从来也没用过用ref关键字在reference类型上,今天才搞明白是怎么回事。
我同意wil的观点,ref应该要慎用,用ref在reference上更是要慎之又慎了。实在没看出有什么理由要用它。

2012年度奖章获得者 2011年度奖章获得者

发表于 2012-1-12 11:09 |显示全部楼层
此文章由 交易人生 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 交易人生 所有!转贴必须注明作者、出处和本声明,并保持内容完整
要理解ref type和value type的区别,就要了解他们的存储方式不同。

value type:系统allocate一块内存存储object content;当访问value type时,直接访问的是这个内存,所以效率也高。

ref type: 系统allocate 2块内存,一个用于存储object content,另一个存储逻辑地址,也可以认为是reference或者是个逻辑上的pointer;当访问ref type是,是通过reference的内容得到object content的逻辑地址。

就一般的method而言,里面定义的value type是被放在stack里的而ref type是放在heap里,这也是不同点;所以,当一个method结束,随着stack的消失,value tppe的存储也被释放;而ref type的东西,要靠garbage collection管理,或者你自己管理。当然对于const int i= 10这类定义,编译器直接用常量,哪里也不放;另外,value type 强行被转换成ref type的parameter ,也可能在stack里。
0  to 1
头像被屏蔽

禁止访问

发表于 2012-1-12 21:34 |显示全部楼层

回复 交易人生 80# 帖子

此文章由 自由的心 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 自由的心 所有!转贴必须注明作者、出处和本声明,并保持内容完整
说的很好......reference-type objectx本身的内容是其实际所指object的地址。
补充一点,reference-type object本身是处于Stack上,其所指object是处于Heap上的,即reference-type object内容所表达的这块地址值才是在Heap上面的
另,你的头像也不错啊,是不是打texas hold‘em在凑royal flush啊
Advertisement
Advertisement

发表于 2012-1-13 20:54 |显示全部楼层
此文章由 flyspirit 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 flyspirit 所有!转贴必须注明作者、出处和本声明,并保持内容完整
原帖由 自由的心 于 2012-1-10 20:38 发表


C#里面 == 比较的是内容,不是地址


我所指是比较变量所指内容的地址,这样说不会混淆了吧。 当然是指reference type.

一般编程是对变量refernece的那个对象感兴趣, 而不是这个变量本身。

发表于 2012-1-13 23:55 |显示全部楼层
此文章由 xji 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 xji 所有!转贴必须注明作者、出处和本声明,并保持内容完整
原帖由 flyspirit 于 2012-1-13 21:54 发表


我所指是比较变量所指内容的地址,这样说不会混淆了吧。 当然是指reference type.

一般编程是对变量refernece的那个对象感兴趣, 而不是这个变量本身。


两个都是半桶水。不要误导新人。

For predefined value types, the equality operator (==) returns true if the values of its operands are equal, false otherwise. For reference types other than string, == returns true if its two operands refer to the same object. For the string type, == compares the values of the strings.

如果overload了==operator,跟overload定,如果没有overload,跟上面定。如果overload了==,也必须overload !=。
头像被屏蔽

禁止访问

发表于 2012-1-14 22:37 |显示全部楼层
此文章由 自由的心 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 自由的心 所有!转贴必须注明作者、出处和本声明,并保持内容完整
好,顶LS
头像被屏蔽

禁止访问

发表于 2012-1-18 19:27 |显示全部楼层
此文章由 自由的心 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 自由的心 所有!转贴必须注明作者、出处和本声明,并保持内容完整
听说要出.NET Framework 5了,基于可能同时出CLR 4.0 SP1

发表于 2012-1-21 16:35 |显示全部楼层
此文章由 flyspirit 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 flyspirit 所有!转贴必须注明作者、出处和本声明,并保持内容完整
原帖由 xji 于 2012-1-14 00:55 发表


两个都是半桶水。不要误导新人。

For predefined value types, the equality operator (==) returns true if the values of its operands are equal, false otherwise. For reference types other than string, = ...


这里人人都懂英文也会看msdn,没有必要从上面摘来一段翻译下。
Advertisement
Advertisement

发表回复

您需要登录后才可以回帖 登录 | 注册

本版积分规则

Advertisement
Advertisement
返回顶部