首页 > 代码库 > 第09天

第09天

1、类的语法

[访问修饰符] class 类名

{

       类的成员;

       //字段、属性、方法

}

访问修饰符:public

类名:Pascal 要求每个单词的首字母都要大写。

 

2、我们写好了一个类之后,需要创建这个类对象,我们管创建这个类的对象的过程,

称之为类的实例化。

使用关键字 new.

 

3、类中成员的作用

1)、字段:存储数据

 

4、类中的成员如果不加访问修饰符,默认是private

private:私有的,只能在类的内部访问,出了这个类之后,就访问不到了。

 

5、this

this代表当前类的对象

 

6、类是不占内存的,而对象是占内存的

 

Person.cs:

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.Threading.Tasks;

 

namespace ex01

{

    public class Person

    {

        public string _name;

        public int _age;

        public char _gender;

 

        public void SayHello()

        {

            Console.WriteLine("hello, I am {0}, I am {1} years old, I am {2}", this._name, this._age, this._gender);

        }

    }

}

 

Program.cs:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
 
namespace ex01
{
    class Program
    {
        static void Main(string[] args)
        {
            Person p1 = new Person();
            p1._name = "James Lee";
            p1._age = 35;
            p1._gender = ‘M‘;
 
            p1.SayHello();
            Console.Read();
        }
    }
}

 

7、属性的作用就是保护字段,对字段的取值和设值进行限定。

 

8、字段就是女人,而属性就是男人。

 

9、三种属性

既有get方法也有set方法的属性我们称之为可读可写属性

只有get方法没有set方法我们称之为只读属性

只有set方法没有get方法我们称之为只写属性

 

demo:

Person.cs:

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.Threading.Tasks;

 

namespace _2_属性的作用

{

    public class Person

    {

       private  string _name;

        public string Name

        {

            get { return _name; }

            set { _name = value; }

        }

         char _gender;

         public char Gender

         {

             get {

                 if (_gender != ‘男‘ && _gender != ‘女‘)

                 {

                     return _gender = ‘男‘;

                 }

                     return _gender;

                

             }

             set { _gender = value; }

         }

         int _age;

         public int Age

         {

             get { return _age; }

             set {

                 if (value < 0 || value > 100)

                 {

                     value = http://www.mamicode.com/0;

                 }

                

                 _age = value; }

         }

        public void SayHello()

        {

            Console.WriteLine("{0}---{1}--{2}",this.Name,this.Age,this.Gender);

        }

    }

}

 

 

Program.cs:

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.Threading.Tasks;

 

namespace _2_属性的作用

{

    class Program

    {

        static void Main(string[] args)

        {

            Person zsPerson = new Person();

            zsPerson.Name = "张三";

            zsPerson.Age = -10;

            zsPerson.Gender = ‘中‘;

            //zsPerson._name = "张三";

            //zsPerson._age = -10;

            //zsPerson._gender = ‘中‘;

            zsPerson.SayHello();

            Console.ReadKey();

        }

    }

}

 

 

mini-ex:

定义一个学生类,有六个属性,分别为姓名、性别、年龄、语文、数学、英语成绩。

有2个方法:

一个打招呼的方法:介绍自己叫XX,今年几岁了。是男同学还是女同学。

两个计算自己总分数和平均分的方法。{显示:我叫XX,这次考试总成绩为X分,平均成绩为X分}

实化两个对象并测试:

张三 男 18  三科成绩为:90 95 80

小兰 女 16  三科成绩为:95 85 100

Student.cs:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
 
namespace ex02
{
    public class Student
    {
        public string Name { get; set; }
        public char Gender { get; set; }
        public int Age { get; set; }
        public int ChineseScore { get; set; }
        public int MathScore { get; set; }
        public int EnglishScore { get; set; }
 
        public void SayHello()
        {
            Console.WriteLine("Hello, I am {0}, I am {1} years old. I am {2}", this.Name, this.Age, this.Gender);
        }
 
        public string CalcSumAndAve()
        {
            int sum = ChineseScore + MathScore + EnglishScore;
            int ave = sum/3;
            return string.Format("I am {0}, My total score: {1}, My average score: {2}", this.Name, sum, ave);
        }
    }
}

 

Program.cs:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
 
namespace ex02
{
    class Program
    {
        static void Main(string[] args)
        {
            Student s1 = new Student();
            Student s2 = new Student();
 
            s1.Name = "zs";
            s1.Gender = ‘M‘;
            s1.Age = 18;
            s1.ChineseScore = 90;
            s1.MathScore = 95;
            s1.EnglishScore = 80;
            s1.SayHello();
            Console.WriteLine(s1.CalcSumAndAve());
 
            s2.Name = "xl";
            s2.Gender = ‘F‘;
            s2.Age = 16;
            s2.ChineseScore = 95;
            s2.MathScore = 85;
            s2.EnglishScore = 100;
 
            s2.SayHello();
            Console.WriteLine(s2.CalcSumAndAve());
 
            Console.Read();
        }
    }
}

 

10、

对象创建好后,依次的给对象的每个属性赋值,这个过程我们称之为对象的初始化。

 

11、构造函数

主要作用就是对 对象进行初始化。

构造函数其实就是一个函数,只不过是一个特殊的函数。

语法:

public 构造函数名()

{

       代码;

}

1、没有返回值,连void也不能写。

2、构造函数的名称必须跟类名一致。

 

12、调用构造函数

new的作用:

1)、在内存的堆中开辟空间

2)、在开辟的堆空间中创建对象

3)、调用对象的构造函数

 

13、构造函数的特点

1)、可以重载

2)、类中默认会有一个无参数的构造函数,当你写了一个新的构造函数后,那个默认的无参数的构造函数就被干掉了。

 

值类型和引用类型:

//值类型:int double char bool decimal struct enum

            //引用类型:string 数组  自定义类

            //堆  栈   静态存储区域

            //值类型:值类型的值是存在栈中

            //引用类型:引用类型的值是存储在堆中的

 

上午总结

Person.cs:

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.Threading.Tasks;

 

namespace _5_上午总结

{

    public class Person

    {

        //字段、属性、方法、构造函数

        //字段:存储数据

        //属性:保护字段

        //方法:行为

        //构造函数:初始化对象(给对象的每个属性依次的赋值)

 

        string _name;

 

        public string Name

        {

            get { return _name; }

            set {

                if (value != "张三")

                {

                    value = "http://www.mamicode.com/张三";

                }

                _name = value; }

        }

        int _age;

 

        public int Age

        {

            get {

                if (_age < 0 || _age > 100)

                {

                    return _age = 0;

                }

                return _age; }

            set { _age = value; }

        }

        char _gender;

 

        public char Gender

        {

            get { return _gender; }

            set { _gender = value; }

        }

 

        public Person(string name, int age, char gender)

        {

            this.Name = name;

            this.Age = age;

            if (gender != ‘男‘ && gender != ‘女‘)

            {

                gender = ‘男‘;

            }

            this.Gender = gender;

        }

 

        public Person()

        {

           

        }

 

        public void SayHello()

        {

            Console.WriteLine("我叫{0},我今年{1}岁了,我是{2}生",this.Name,this.Age,this.Gender);

        }

 

    }

}

 

 

Program.cs:

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.Threading.Tasks;

 

namespace _5_上午总结

{

    class Program

    {

        static void Main(string[] args)

        {

            Person person = new Person("李四",190,‘中‘);

            person.SayHello();

            Console.ReadKey();

        }

    }

}

 

 

mini-ex:

写一个Ticket类,有一个距离属性(本属性只读,在构造方法中赋值),不能为负数,有一个价格属性,价格属性只读,并且根据距离distance计算价格Price (1元/公里):

0-100公里        票价不打折

101-200公里    总额打9.5折

201-300公里    总额打9折

300公里以上    总额打8折

有一个方法,可以显示这张票的信息.

测试上面的类

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.Threading.Tasks;

 

namespace demo01

{

    public class Ticket

    {

        private int distance;

 

        public int Distance

        {

            get

            {

                if (distance < 0)

                {

                    return 0;

                }

                return distance;

            }

        }

 

        public Ticket(int distance)

        {

            this.distance = distance;

        }

        private double price = 100;

 

        public double Price

        {

            get

            {

                if (Distance < 100)

                {

                    return distance*1.0;

                }else if (Distance < 200)

                {

                    return distance * 0.95;

                }else if (Distance < 300)

                {

                    return distance * 0.9;

                }

                else

                {

                    return distance * 0.8;

                }

                

            }

        }

 

        public void ShowInfo()

        {

            Console.WriteLine("{0} cost {1}", this.Distance, this.Price);

        }

    }

}

 

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.Threading.Tasks;

 

namespace demo01

{

    class Program

    {

        static void Main(string[] args)

        {

            Ticket t = new Ticket(200);

            t.showInfo();

            Console.Read();

        }

    }

}

 

15、GC Gargbage Collection

当我们程序结束之后,GC会扫描整个内存,发现,如果有的空间没有被指向,

则马上把这块空间销毁。

 

16、在一个项目中引用另一个项目的类

1、添加要引用的类所在的项目。

2、引用命名空间

 

17、访问修饰符

public :公开的,公共的

private:私有的,只能在类的内部访问,出了这个类之后,就访问不到了。

能够修饰类的访问修饰符只有两个:

1)、public

2)、internal:表示只能在当前程序集的内部进行访问,出了这个程序集就访问不到啦。

对于咱们而言,现阶段就将程序集理解为当前项目。

 

18、字符串

由于字符串的不可变性,所以,当我们需要给一个字符串进行大量的拼接、赋值等操作的时候,

会产生大量的内存垃圾,所以说,这么做是不合算的。

如果你需要对一个字符串进行大量的重复,拼接等操作,我们推荐使用StringBuilder

 

19、字符串的各种方法

ToCharArray():将字符串转换成char类型的数组

new string(char[] chs):将一个字符数组转换成一个字符串

ToUpper():表示将一个字符串转换成大写形式。

ToLower():表示将一个字符串转换成小写形式。

Equals("要比较的字符串",StringComparison.OrdinalIgnoreCase):比较字符串,忽略大小写

Split(new char[]{‘要分割的字符串‘},StringSplitOption.RemoveEmptyEntries):分割字符串,返回一个字符串类型的数组

Substring():截取字符串

 

练习一:随机输入你心中想到的一个名字,然后输出它的字符串长度  Length:可以得字符串的长度

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.Threading.Tasks;

 

namespace demo02

{

    class Program

    {

        static void Main(string[] args)

        {

            Console.WriteLine("Input a string:");

            string inputString = Console.ReadLine();

            Console.WriteLine(inputString.Length);

            Console.Read();

        }

    }

}

 

练习二:两个学员输入各自最喜欢的课程名称,判断是否一致,如果相等,则输出你们俩喜欢相同的课程.如果不相同,则输出你们俩喜欢不相同的课程.

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.Threading.Tasks;

 

namespace demo03

{

    class Program

    {

        static void Main(string[] args)

        {

            Console.WriteLine("Input student‘s a‘s favorite class:");

            string studentAFav = Console.ReadLine();

            Console.WriteLine("Input student‘s b‘s favorite class:");

            string studentBFav = Console.ReadLine();

 

            if (studentAFav.ToLower() == studentBFav.ToLower())

            {

                Console.WriteLine("Same");

            }

            else

            {

                Console.WriteLine("Different");

            }

            Console.Read();

        }

    }

}

 

第09天