C#基础课程2019版-适合零基础
C#基础课程2019版-适合零基础

迄今为止最容易看懂的一本C#入门书本,这是基于这本书的一套基础视频课程。适合零基础的同学。

共76集 未完结 创建时间:2019-02-10 12:43

收藏:3 访问:4242 学生:97

97人
收藏
分享

你好 有时间 会更新的。不过可能会稍后一些。可以先看其他课程。

@一朵云 老师,这个课程还会更新吗?第5版都出来了

2020-07-03

老师,这个课程还会更新吗?第5版都出来了

2020-07-03

你好 检查下 你的程序是不是有写死了 某个路径。使用了绝对地址。


@logic 老师,您好。我在本地生成一个Debug程序文件,拷贝到另一台...

2020-06-26

老师,您好。我在本地生成一个Debug程序文件,拷贝到另一台电脑上。在使用了几天后另一个电脑报了异常,但是异常抛出的位置显示的是我本地电脑的位置,请问这个是正常的么,又是怎么回事呢?谢谢

111.png

2020-06-26

才想學習時,就有這個課程,真好!

2020-05-16

@孙老师 谢谢老师的耐心,明白了!

2020-04-10

@logic 1 可以把对象new在循环外面,这样 可以保证只有一个对象 然后再循环里面 修改属性 

 public bool aaa = true;         
        private void Test()    
        {    
            Person person = new Person(); 
            while (aaa)    
            {    
                person.Name = "bamn.cn";
                Thread.Sleep(200);    
                aaa = false;    
            }    
        }

2 垃圾回收的时间 不确定 这个也控制不了。也不需要关心这个

2020-04-10
@孙老师 

哦 ,谢谢回复。

1、那再做线程死循环的时候,针对上述这种循环内部有new对象的问题应该如何解决呢?

2、还有就是下段代码在new了一个对象后,我看内存就会被占用一部分,然后用VS2017监视等了一段时间也并没有被销毁啊,这个大约是多少时间呢?图片无法上传

 public bool aaa = true;     
        private void Test()
        {
            while (aaa)
            {
                Person person = new Person();
                Thread.Sleep(200);
                aaa = false;
            }
        }

2020-04-10

@logic 此外 我们可以主动垃圾回收的

        private static void Test()
        {
            while (true)
            {
                person person = new person();
                Thread.Sleep(200);

                //主动垃圾回收 首先需要把对象new Person() 设置为“无主对象”
                person = null;//把person设为null 这时候 就没有栈内存保存new Person的地址了 就变成了无主对象
                GC.Collect();//主动垃圾回收
            }
        }

image.png

2020-04-10

@logic 你好 你这两个写法是一样的

 private void Test()
        {
            while (true)
            {
                person person = new person();
                Thread.Sleep(200);
            }
        }
private void Test()
        {
            while (true)
            {
                person  person =null;
                person = new person();
                Thread.Sleep(200);
            }
        }

你好 你如果有睡眠 Thread.Sleep() 那么 CPU就不会占满了 因为有睡眠时间 就有间隙时间 就相当于 一个人 干活一会 休息一会 那么这个人  就不会很累 但是如果一直不停干活 那么他就会累垮。 cpu就是这样 就算你给它暂停5毫秒 也可以

比如

Thread.Sleep(5);

反正只要有睡眠时间 那就不会卡死。因为在睡眠的时候 CPU可以分配资源给我们操作系统的其他进程。 如果一直占用 那其他进程就得不到资源了。


另外 你给了睡眠时间 那么程序创建的对象 就有空闲时间给垃圾回收期回收。 估计内存不会占用很大


你可以试试 创建一个占用非常大的内存的对象。

比如 你可以创建一个byte[] 对象 .然后给他分配很大的容量 然后往里面填充数据。可以试试


    class Program
    {
        static void Main(string[] args)
        {
            new Thread(new ThreadStart(Test)) { IsBackground = true }.Start();
            Console.ReadKey();
        }

        private static void Test()
        {
            while (true)
            {
                person person = new person();
                Thread.Sleep(200);
            }
        }
        public class person
        {
            private string name;
            private string sex;
            public string Name { get => name; set => name = value; }
            public string Sex { get => sex; set => sex = value; }

            public byte[] b = new byte[123321123];

            public person()
            {
                for (int i = 0; i < b.Length; i++)
                {
                    b[i] = 0;
                }
            }

        }
    }


image.png

2020-04-10
@孙老师 
       private void button1_Click(object sender, EventArgs e)
        {
            new Thread(new ThreadStart(Test)) { IsBackground = true }.Start();
        }

        private void Test()
        {
            while (true)
            {
                person person = new person();
                Thread.Sleep(200);
            }
        }
        public class person
        {
            private string name;
            private string sex;
            public string Name { get => name; set => name = value; }
            public string Sex { get => sex; set => sex = value; }

        }

老师,我写了这样的一个程序,按照您说的,这样应该会内存耗完,CPU负荷增大。但是我通过VS2017监视发现并没有出现类似情况,难道是Thread.sleep(200) 导致堆中的数据被及时回收了么?

那如果我这样写呢:

private void Test()
        {
            while (true)
            {
                person  person =null;
                person = new person();
                Thread.Sleep(200);
            }
        }

一直纠结这个问题就是因为程序中用了线程再做死循环,而想搞明白放在死循环里面的new 对象,会不会导致程序不规范而造成多对象出问题。谢谢

2020-04-10
@logic 
while(true)
{
   A a =new A();
}

while 和for一样 目的都是循环 本质一样。

这里的while true 就会死循环

然后不断创建对象 但是由于垃圾回收 不及时 所以 内存会慢慢消耗完 cpu也会高负荷工作 所以会出现卡死 甚至死机。

您可以自己试试。 先保存好电脑的东西 以免丢失

2020-04-10

@黄老师 还有一种情况,比如说线程中开启死循环的的while里面:

while(true)
{
   A a =new A();
}

这种情况方法应该是一直没有结束吧,它是类似于for循环机制来处理对象的么?

2020-04-10

@黄老师 谢谢黄老师的耐心讲解。

2020-04-10

@logic 1 由于这个Person p1 = new Person()是放在for循环外面的 所以就算for循环执行完了 这个对象还是不会消失的 因为for循环的代码块和Person p1..... 不在一块。 只是这里for循环 每次都去修改一下 p1 所指向的那个对象 new Person() 里面的那个Name的值。 所以执行完for后 堆中 只有一个new Person对象。

2 for循环和点击按钮创建对象 是不一样的 点击按钮 其实是调用委托方法 委托方法 本质上也是一个代码块 执行完代码块 这个对象也会等着回收的。

总之 在方法内部创建的对象 方法执行完后 就会出栈 然后等着垃圾回收。当然有例外 比如是引用参数out 或者ref的参数 或者从方法外面 传进来的引用参数。

2020-04-10

@黄老师 谢谢及时回复。

那还有两个问题:

1、下面这种写法在for循环结束后P1是否存在?

Person p1 = new Person();
for (int i = 0; i < 10; i++)
{
    p1.Name = "桂洪";
    Console.WriteLine(p1.Name);
}

2、另抛开for循环,声明一个对象后,程序每执行一次new一下该对象【比如点击按钮】,那程序执行多次后该对象的存在形式是否与for循环对于对象的处理是否一致呢?执行完就立即销毁么

2020-04-10
@logic 
for (int i = 0; i < 10; i++)
{
    Person p1 = new Person();
    p1.Name = "桂洪";
    Console.WriteLine(p1.Name);
}

这里 当每次循环结束 就跳出代码块 这时候 p1就会出栈 也就是会被销毁 并且是立即销毁

然后new Person() 这个对象 是在堆里面 它会等着垃圾回收期回收 

所以 最后 执行完后 堆中 可能会有十个对象 也可能没有 关键是看有没有垃圾回收 这些对象 由于没有被引用(也就是 没有Person p1 这类栈内存存储他们的地址) 所以 等于“无主对象”无主对象 会等着垃圾回收

image.png

2020-04-09

老师:如果一个对象【唯一对象名】,每当一次循环就new一次,那每当下一次循环new此对象的时候,上一个对象将被覆盖,因为名称相同,但此时会被重新分配一个内存地址。比如下面代码其实只创建了一个对象,是吧?

for (int i = 0; i < 10; i++)
{
    Person p1 = new Person();
    p1.Name = "桂洪";
    Console.WriteLine(p1.Name);
}
Console.ReadKey();


2020-04-09

@logic 你好 winform暂时 不支持控件半透明效果 。你可以试试使用WPF wpf就可以。winform里面 只支持窗体的半透明

Opacity 设置这个属性 就是半透明效果。

当然 可能自己封装控件 可以实现 具体老师没有研究过 您可以自己试试

2020-04-02