日期:2014-05-17  浏览次数:20778 次

关于c#的一些疑问,估计很简单
1.在一个类A中定义个私有变量a,再定义个方法,在该方法中再定义一个对象A test=new A();
为什么这个地方的test能访问私有变量a呢?对对象test来说a不是私有的吗?是不能访问的吗?
2.在一个方法中定义一个对象,并在该方法中为该对象加锁,在锁的生命周期中在调用自己这个方法,会产生死锁吗
3.在一个主线程中定义一个从线程,关闭主线程会关闭从线程吗?或者是在主线程中新建两个线程
a,b 线程a与线程b是没有什么关系的,是吗?

1.是可以访问私有变量的
2.不会产生死锁
3.主线程和从线程是有关系的。从线程与从线程之间是没有什么关系的
c#

------解决方案--------------------
1.定义的a指的是类的私有变量,每个对象有有属于自己的a。
A test=new A()
B test2=new B()

A里面的a跟B里面的a是两个东西,虽然名字都一样
------解决方案--------------------
有一个类叫学生,学生有私有变量学号,
学生类实例化: 
学生 张三 = new 学生();
于是张三具有了学号这个变量.

2.3不会 我也是小白.
------解决方案--------------------
你是自问自答吗?上面问题下面答案,虽然答案不一定准确。

1、2的答案算是没问题,3的答案是错误的,各个线程直接都没有关系,不分主从,只有后台线程的区分,所谓后台线程,就是不能单独存在的线程,当其它线程都退出了,剩下后台线程也活不了,自动消失,进程结束。
------解决方案--------------------
第一个问题我有个疑问。你是怎么访问a的?
第二个问题。你不但是死锁。是死循环了吧?一个递归调用
第三个。线程是独立的。你关闭了主线程。别的线程自己不终止也是不会关闭的。
------解决方案--------------------
1,

        public void print()
        {
            A gg = new A("sfd");
            gg.strname="dfdf";//私有变量在类内部都可以访问。
              //这个this是你在外部方法new A的时候的那个对象,而gg是你在在new A后的对象调用的print方法的时候重新new A的对象,所以,当你调用了print方法,你new了两个A,this就是调用print方法的那个对象
             this.strname = "dfdf";//        }

2,可能你的问题我理解的不是很清楚。不过锁是针对多个线程争夺资源而设定的,如果你是单个线程,不牵扯死锁的问题,如果多个线程同时遇见lock的对象正在使用,会等正在使用的线程释放lock资源后,才会进行访问,但如果正在使用的线程一直没有给等待线程发送信号释放资源,此时,就可能造成死锁,不过,不只这只是造成死锁的一种情况。
3,线程是独立的。
------解决方案--------------------
引用:
每一个进程的创建不是默认创建一个主线程吗?主线程调用进程中的资源,在主线程中创建一个线程1,该线程1也是调用进程中的资源,当主线程关闭时,进程会关闭吗?如果进程关闭,没有资源了,线程1会关闭吗

你可以自己尝试创建在Main函数里打开另一个线程,线程为长时间的Thread.Sleep,确保足够长的时间在运行,如果Main函数没有打开Form的话,将直接结束,你再看看进程是否还在。
------解决方案--------------------
你会用任务管理器吗?你会创建控制台程序吗?
在控制台程序里,新建线程调用,如果控制台程序不添加Console.Read();之类的方法等待用户输入,会直接结束的。任务管理器中监视刚才运行的程序进程,进程还在的话,就说明各个线程是无相独立的。

事实上,只要有一个线程不结束,进程就不会结束,各个线程所拥有的资源是独立的。你把进程理解为多个线程的集合就可以了,集合数量为0才会结束。当然,有一种辅助线程,也叫后台线程,是依赖创建它的线程的。任何委托的BeginInvoke创建的都是这类辅助线程,无法单独存在,主线程必须在运行。Thread类也有一个IsBackground,设置是否为后台线程,默认值为false。
------解决方案--------------------
因为你实例化了类A 而带有private修饰的字段是在类A里面的。所以可以访问。  如果你不想访问可以设置属性啊。
class Program
    {
        private string a {set; }
        public Program()
        {
            a = "0.0";
        }
        
        static void Main(string[] args)
        {