首页 新闻 会员 周边 捐助

.net 在调用类的时候是调用类本身,还是类的副本

0
[已解决问题] 解决于 2019-05-28 16:47

1 一个类,里面有公共方法,多线程中都去调用公共类中的方法,这时调用的是类方法本身,还是每个线程调用的都是类方法的副本?
2 一个普通类,里面有一个静态的字段,类实例化多次,这个静态字段是只有第一次实例化的时候被创建,其余实例化的时候是把第一次创建的时候的地址给后面实例化的静态字段了么?
3 平常干活代码会写。。。我是自学的编程,所以好多这种基础知识不明白,有没有什么推荐的书,专门讲这种基础内容的?

百鸟朝凤的主页 百鸟朝凤 | 菜鸟二级 | 园豆:260
提问于:2019-03-28 16:41
< >
分享
最佳答案
0

刚入行吧。多花点时间考虑这些问题应该会有提升。
上面有一楼已经回答得不错了。

计算机牛逼的地方就是 存储代码,执行代码。方法就是代码。开多个线程调一个类里的方法,这里方法代码就一份,所以才会出现后面的临界资原问题。方法就一串静态的代码放那里,只有一份。第二个问题,如果你是计算机专业的不应该这样问,书上明确说明静态属性,字段属于类的,所以也不是第一次实例化时创建,而且是属于类的,也就是类创建的时候就创建了,什么时候?加载dll到内存,用类的Type创建类的结构时就有了。而你再用这个类的结构去创建instance,这个时候就是对象的数据了。第三个问题,不急,时间长点,你想的问题多了就会慢慢积累就多了。自学还是有些局限性,当然知识你都可以拿得到的,只要你原意。

奖励园豆:5
gw2010 | 小虾三级 |园豆:1487 | 2019-03-29 11:19

这些基础知识都是在哪些书上看到的,能推荐基本讲解基础的书么

百鸟朝凤 | 园豆:260 (菜鸟二级) | 2019-03-29 11:23

@百鸟朝凤: 计算机基础课程,组成原理,程序计设,比如静态字段那个,一般的程序设计书都会讲到。第一个问题理解就要多个地方综合起来了看了。比如学习组成原理说到内存有几个区,有代码区,有数据区等等,那么我们类的方法,那就是在代码区里面,平时数据,参数应该是在数据区,而且函数调用里面堆栈的结构,这个栈结构那数据结构里面又讲到了,后进先出,结合函数调用你就清楚整个运行,再深入还会想到cpu里面寄存器,运算器,代码执行是在运算器里面,cpu运算,寄存器放指令,一条一条执行等等,相关的知识很多,不一定要全部清楚,但是同我们使用到相关的,可以尽量弄清楚。不同职业可能清楚的地方不一样,比哪网络,硬件,软件可能不同职了解不同,不要求样样精通,你写代码,那么相关的你这几个问题应该要了解清楚。

gw2010 | 园豆:1487 (小虾三级) | 2019-03-29 11:31

@gw2010: thank you

百鸟朝凤 | 园豆:260 (菜鸟二级) | 2019-03-29 17:29
其他回答(5)
0

你看看《CLR var C#》这本书就明白了。我虽然也看过此书,但是我已经忘了。

会长 | 园豆:12463 (专家六级) | 2019-03-28 16:53
0

我的理解是:
1)静态方法只有一份,但静态方法内声明的变量,在每个线程调用时,都会新创建一份。
2)静态成员也只有一份,只在第一次访问静态成员时创建,或第一次类实例化的时候创建。

大豆男生 | 园豆:608 (小虾三级) | 2019-03-28 17:53
1

1.方法没有副本的说法.所有的方法都是静态.
2.不是在第一次实例化时被创建.是在这个类的静态成员第一次被调用时触发静态构造函数.初始化静态字段.
3.找个重点大学的软件专业.看看他们专业有哪几门课.把教科书都买.跟着他们的教学计划慢慢学.

吴瑞祥 | 园豆:29449 (高人七级) | 2019-03-28 19:44

那多线程同时调用同一个方法,方法里面的变量,是存储到每个线程自己单独的内存区域中,只不过是大家都按照方法这个逻辑顺序执行对吧?

支持(0) 反对(0) 百鸟朝凤 | 园豆:260 (菜鸟二级) | 2019-03-29 10:08
0

你的第一个问题,感觉是把类和对象搞混了

新的开始 | 园豆:679 (小虾三级) | 2019-03-28 22:28

额。。。可能是我描述不太清楚。 我的意思是 多线程调用同一个方法的时候,多个线程同时调用,方法内部的变量不会造成混乱么。例如,第一个线程刚把一个变量赋值为5,第二个线程又进这个方法,把变量赋值成了3

支持(0) 反对(0) 百鸟朝凤 | 园豆:260 (菜鸟二级) | 2019-03-29 10:12

@百鸟朝凤: 类和对象是两码事。类存在哪里,就是抽象的定义,我们把类实例化出来,就是要操作的对象。每次实例化,都是在原有的类的基础上得到的,之间并没有实际的联系,只能说可以都有相同的成员。做个很简单的例子就明白了。写个泛型,吧数据源往泛型里面塞要写个循环,你循环每次都使用同一个对象接受并且添加到泛型里面,和循环里面实例化类往泛型里面添加的区别。就这样。
至于更深的对象的值放在堆上面,对象的地址放在栈上面,我自己也是一知半解,就不误导人了

支持(0) 反对(0) 最幸运的爷 | 园豆:200 (初学一级) | 2019-03-29 16:08
0

我是菜鸟,我觉得静态成员和常量一起理解比较好,感觉就像引用类型在内存中存储方式一样,是key指向value,key有多个,但是value只有一个。。。。。不知道我说的意思楼主有没有听懂

刘下来 | 园豆:919 (小虾三级) | 2019-03-30 08:57
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册