黑马程序员《.NET 构造函数,字符串处理》

时间:2023-01-30 00:42:45

------- Windows Phone 7手机开发.Net培训、期待与您交流! -------

(1)构造函数

什么是构造函数?

构造函数是一种特殊的方法,有以下特点:

它的方法名与类名相同。

没有返回类型。

主要完成对象的初始化工作。

使用构造函数的好处:

对多个属性进行赋值时,不需要重复的写实例名;

可以保证用户在new一个对象的时候必须对某一个属性进行赋值。

当我们定义好一个类之后,如果我们没有写构造函数,那么系统会自动给我们加上一个默认的无参数的构造方法,在这个构造方法中什么也不做,我们也看不到。

构造方法是一个特殊的方法,它的名字和类的名字相同,并且没有返回值,连void也可以省略不写。我们一旦手写一个构造方法后,系统原先默认给我们添加的那个无参的构造方法就不会再为我们添加了。

构造函数可以重载,也就是可以有多个参数不同的构造函数。

下面配上代码来理解:

namespace    //这里用构造方法解决
{
    class Student  //习题1    定义一个学生类,有六个属性,分别为姓名,
    //性别,年龄,语文,数学,英语成绩
    {    //还有两个方法,一个打招呼,另一个现实总成绩和平均成绩
        //实例化两个对象并测试张三 男 18  三科成绩90 95 80
        //小兰 女 16  三科成绩95  85  100
   

        public Student(string name,char sex,int age,int chinese,int math,int english)
        {
           this.name=name; //这里this表示当前类当前字段  与下面的name一致而后面的name 
                      //与当前构造方法中的name一致
           this.sex = sex;
           this.age = age;
           this.chinese = chinese;
           this.math = math;
           this.english = english;
        }
        public Student(string name,char sex,int age)

        //这里我只想构造一个含三个参数的构造方法
        {                       //其余的我就通过属性赋值,
            this.name = name;      //构造方法也可以重载
            this.sex = sex;
            this.age = age;
        }
        string name;                    

        public string Name
        {
            get { return name; }
            set { name = value; }
        }
        char sex;

        public char Sex
        {
            get { return sex; }
            set
            {
                if (value == '男' || value == '女')
                {
                    sex = value;
                }
                else
                {
                    sex = '男';
                }
            }
        }
        int age;

        public int Age
        {
            get { return age; }
            set
            {
                age = value >= 0 ? value : 0;
            }
        }
        int chinese;

        public int Chinese
        {
            get { return chinese; }
            set
            {
                chinese = value >= 0 ? value : 0;
            }
        }
        int math;

        public int Math
        {
            get { return math; }
            set
            {
                math = value >= 0 ? value : 0;
            }
        }
        int english;

        public int English
        {
            get { return english; }
            set
            {
                english = value >= 0 ? value : 0;
            }
        }

        public void SayHello()   //构造打招呼的方法
        {
            Console.WriteLine("我叫{0},我今年{1}了,我是{2}同学",
                name, age, sex);
        }

        public void ShowScore()   //实现平均成绩的方法
        {
            int sum = chinese + english + math;
            int avg = sum / 3;
            Console.WriteLine("我叫{0},我的总成绩是{1},平均成绩是{2}",
                name, sum, avg);
        }
    }
}

代码中标红色的两个构造方法分别声明了不同个数的参数,但它们类名一样,所以就构成了构造方法的重载,构造方法中的参数要在代码中用this来表示当前字段。

上面我们自己定义了构造函数后那么在另一个类中如何应用?

如下:

namespace 习题
{
    class Program
    {
        static void Main(string[] args)
        {
            Student zsStudent = new Student("张三",'男',18,90,95,80);//定义构造函数时必须赋值
            Student xlStudent = new Student("小兰",'女',16);
            xlStudent.Chinese = 95;
            xlStudent.Math = 85;
            xlStudent.English = 100;

            Console.WriteLine("下面是张三打招呼和显示成绩的方法");
            zsStudent.SayHello();  //调用方法
            zsStudent.ShowScore();

            Console.WriteLine("下面是小兰打招呼和显示成绩的方法");
            xlStudent.SayHello();
            xlStudent.ShowScore();
            Console.ReadKey();
        }
    }
}
在另一个类内,我们给Student的6个属性进行直接赋值即可,省却了不必要的麻烦,重复写实例名。

(2)字符串的处理

string类常用方法:

①Tollow():得到字符串的小写形式

②字符串是不可变的,所以这些函数都不会直接改变字符串的内容,而是把修改后的字符串的值通过函数返回值的形式返回  例如:s=s.Tollow()

③ToUpper():得到字符串的大写形式,Trim()去掉字符串两端的空白。

④s1.Equals(s2,StringComparison.OrdinallgnoreCase)两个字符进行不计大小写的比较

相关例题:

string scoreA = "c#";
            string scoreB = "C#";
            scoreA = scoreA.ToLower();//考虑用户输入的大小写问题  先转化后在进行比较
            scoreB = scoreB.ToLower();

            if (scoreA == scoreB)
            {
                Console.WriteLine("你们喜欢相同的课程");
            }
            else
            {
                Console.WriteLine("你们喜欢不同的课程");
            }
            Console.ReadKey();

(3)字符串的分割

①String[] split(params  char[]  separator)将字符串按照指定的分隔符分割为字符串数组

String[] split(char[]  separator,StringSplitOptions options)将字符串按照指定的char分割符分割为字符串数组

例题:    string str = "2008年-08月-08日";
            char[] removechar = { ' ', '-' };
            //通过分隔符空格等char类型字符把字符串
            //分割为字符串数组
            string[] words = str.Split(removechar);
            //去掉多余的空字符 
            Console.WriteLine("上句话共有{0}个单词", words.Length);
            Console.WriteLine("这几个单词分别是:");
            for (int i = 0; i < words.Length; i++)
            {
                Console.Write(words[i]);
            }
            Console.ReadKey();
 

字符的分割再加上拼接:Split()和Join()

string str = "2008年-08月-08日";
            //分割为字符串数组
            string[] words = str.Split('-');
            //去掉多余的空字符 
            Console.WriteLine("上句话共有{0}个单词", words.Length);
            Console.WriteLine("分割后的单词分别是:");
            foreach (string s in words)
            {
                Console.WriteLine(s);
            }
            //将分割后的字符串拼接起来
            string joinString = string.Join("*",words);
            Console.WriteLine(joinString);
            Console.ReadKey();

(4)字符串的截取

用到的是substring    

string  resault=str.string.Substring(6);表示将字符串str中的第6位开始截取一直到最后。

例题:string str = "Hello,World!";
            string result = str.Substring(6);//substring(6)表示从第六个开始截取字符串
            //一直截取到最后
            Console.WriteLine(result);
            Console.ReadKey();

最后输出结果是World!  

第一个字符用0来表示。

(5)判断某个字母第一次出现的位置

用到的是Indexof

例题:
            string str = "Hello,World!";
            Console.WriteLine(str.IndexOf("o"));//用于判断首个o出现的位置 从0开始,所以输出4
            Console.ReadKey();

规定位置的判断
            string str = "Hello,World!";
            Console.WriteLine(str.IndexOf("o", 5));//用于判断第二个o出现的位置
            //从位置5开始向后搜索
            Console.ReadKey();

 

总结:

c#中字符串有一个重要的特性:不可变性即字符串一旦声明就不可以改变,所以只能通过索引来读取指定位置的char,不能对指定位置的char进行修改。也可以将string看作是char的只读数组。

如果要对char进行修改,那么就必须创建一个新的字符串,用s.ToCharArray()方法来得到字符串的char数组,对数组进行修改后,调用new string(char[])这个构造函数来创建char数组的字符串,一旦字符串被创建,那么char数组的修改也不会造成字符串的变化。

 

------- Windows Phone 7手机开发.Net培训、期待与您交流! -------