黑马程序员————————C#基础知识(五)

  ---------------------- ASP.Net+Android+IOS开发.Net培训、期待与您交流! ---------------------- 

l       方法

l       变量的作用域和方法的重载

l       返回值

l       out和ref

l       实心菱形和一些常用方法

1.方法

用来复用代码,当我们在一个程序中反复的写了某些代码,那么一般情况下,我们可以把需要重复写的代码定义在一个方法中,用的时候只需要调用就行了。

定义方法的基本语法:

 访问修饰符 static  返回值类型 方法名(参数)

    {

   方法体

    }

访问修饰符可以不写,static定义了静态方法。

注意:

1)方法一般写在类里边。

2)如果方法没有返回值,则用void代替。

3)方法名后面的参数可以省略,但小括号不能省略。

方法命名规则:

方法名开头字母大写,参数名开头小写,参数名,方法名要有意义。

方法的调用:对于静态方法,如果要调用的方法在同一个类中,直接写方法名就可以,不是在同一个类中则需要在前面写上类名。

类名.方法名();

2.变量的作用域和有参数方法的调用:

 在方法中定义变量称为局部变量,其作用域从定义开始,到其所在的大括号结束为止。

想要调用某个方法,需要调用者传参数到被调用的方法中,并且传递的参数个数必须跟被调用的方法名后面括号内定义的参数个数相同,且一一对应,数据类型也要一致。

例如 Text1(2,3,"我是字符串c");

              staticvoid Text1(int a,int b,string c)

       {

           Console.WriteLine(@"""{0}"",我是数字{1},我是数字{2},我是a,b的和{3}",c,a,b,a+b);

       }

3.返回值

  调用者调用方法后返回的值。

类似Console.ReadLine();  等,都是封装起来的方法,我们自定义的方法也与其类似,我们把具有某些常用功能的代码写在一个方法中,当需要使用时直接调用此方法,调用格式跟Console.ReadLine();使用格式一样类名.方法名(); ()内为需要用此方法进行计算的参数,需要保证它的数据类型与被调用方法的定义参数数据类型相同并且一一对应;而返回值,就是通过被调用方法计算后得到的值,如果我们想在调用的方法中再次得到该值,我们需要在被调用方法中通过 return  值来返回该值,同时需要在调用的方法中声明一个与该值类型相同的变量来接受该值。总而言之,调用自定义方法时,必须保证传递参数和定义参数一致,返回值与接收变量一致。

要熟练对自定义方法的封装和运用,要求自定义方法中写入的是最简单精炼的代码,这样才能有最广泛的用途,特例除外。

 例如:

       staticvoid Main(string[] args)

       {

           Console.WriteLine("请您输入一个整数");

           int number = ReadNumber();

           Console.WriteLine("您输入的数字是"+number);

           Console.WriteLine("请输入您的年龄");

           int age = ReadNumber();

           Console.WriteLine("您是{0}年出生的",2013-number);

           Console.ReadKey();

       }

       staticint ReadNumber()

       {

           do

           {

               try

               {

                   int number =Convert.ToInt32(Console.ReadLine());

                   return number;

               }

               catch

               {

                   Console.WriteLine("您输入的有问题,请重新输入");

               }

           }

           while (true);

       }

如上,写入ReadNumber方法中的程序,可以经常用于要求用户单次输入某个数字类程序调用。

定义在方法之外类中的变量,叫做类的字段。

4.程序的调试

  设置断点  在编辑窗口左部灰色条点左键。

      

          红色圆点即为断点

 

       

   从左到右依次是逐语句F11;逐过程F10;跳出所在方法shift+F11

                 

调试时按F11(逐语句)会进入调用方法,按F10(逐过程)会跳过调用方法。

5.方法的重载

假若在需要调用的方法所在的类中有相同方法名的方法,并且这两个方法的参数个数不同或者对应位置上的数据类型不同,就会构成方法的重载。(返回值类型不同不能构成重载

例如  Console.WriteLine();

     这本是封装在Console类下的方法WriteLine,但是它却可以接受和返回任何类型的值,原因就是因为它并非一个方法,而是多个不同参数的同名方法封装在一个类下造成假象,

如图,多个WriteLine方法封装在同一个类中时,当我们调用是就会根据参数的不同而加载不同的方法进行计算,这就是方法的重载。

例如:    //定义方法找出用户输入的一串数字中的最大值,并且求和,求平均值

               Console.WriteLine("请您输入这串数字的个数");

               int max = ShuZu();

               Console.WriteLine(max);

               Console.ReadKey();        

       }

 

       staticint ReadInt(refint i)             //方法1(可重载)

       {

           while (true)

           {

               try

               {

                   int numbers =Convert.ToInt32(Console.ReadLine());

                   return numbers;

               }

               catch

               {

                   Console.WriteLine("您的输入有误,请重新输入第{0}个数字", i + 1);

               }

           }

       }

       staticint ReadInt()     //方法2(重载+1

       {

           while (true)

           {

               try

               {

                   int numbers =Convert.ToInt32(Console.ReadLine());

                   return numbers;

               }

               catch

               {

                   Console.WriteLine("您的输入有误,请重新输入");

               }

           }

       }

       staticint ShuZu()

       {

           int input = ReadInt();          //调用重载方法1

           int[] numbers =newint[input];

 

           int sum = 0;

           for (int i = 0; i < numbers.Length; i++)

           {

               Console.WriteLine("请您输入第{0}个数字", i + 1);

               numbers[i] = ReadInt(ref i);            //调用重载方法1

               sum += numbers[i];

           }

           int max = numbers[0];

           for (int i = 0; i < numbers.Length; i++)

           {

               if (numbers[i] > max)

               {

                   max = numbers[i];

               }

           }

           return max;    //改成sum,sum/input可输出总和,平均值(建议改变返回值类型,并且sun*1.0)

       }

上例中通过方法的循环嵌套重载等,实现了活性输出反应。

6.out 

    用于方法中有多个返回值的时候,通过传出参数来返回值。

应用方法:

1)在被调用的方法的参数数据类型前加out,同时在调用方法中的参数前加out表明该参数为接受被调用方法的传出值而非向被调用方法中传入值。例如:

       int max, min;

             int sum = Compute(numbers,out max,out min);

           Console.WriteLine("您输入的这串数字的和为{0},最大数为{1},最小数为{2}",sum,max,min);

           Console.ReadKey();

           }                                           //这是Main方法的结束大括号,调用方法

      staticint Compute(int[] numbers,outint max,outint min) //自定义被调用方法,用于求和求最大最小

          {

              int sum=0;

              max=numbers[0];

              min=numbers[0];

              for (int i = 0; i < numbers.Length; i++)

              {

                  sum += numbers[i];

                  if (numbers[i] > max)

                  {

                      max = numbers[i];

                  }

                  if (numbers[i] < min)

                  {

                      min = numbers[i];

                  }

              }

              return sum;

          }

上面所示代码中,我们需要通过自定义方法返回多个值,而方法的返回值只能有一个,这个时候,我们通过传参来建立值的返回通道,用out作为通道的建立口。          

2)在调用方法中,我们不需要对以out定义的参数赋初值,而在被调用方法中这个参数必须被赋值

7. int.TryParse();重写

 staticbool MyTryParse(string s,outint a)

       {

           a = 0;

           try

           {

               a =Convert.ToInt32(s);

               returntrue;

           }

           catch

           {              

               returnfalse;

           }

       }

用于尝试将字符串转换成数字,即便是字符串无法转换为数字,也不会像convert.ToInt32()/int.Parse()一样报错。

8.ref

   out类似,属于引用传递(传空间地址)。(待理解,什么是引用传递,跟引用命名空间等是否为一个概念?

传递参数的过程中,如果参数前面有 out或者ref时,被调用方法中的值改变也会带动调用者方法中变量值改变.例如:

  int [] number=newint [5];

               for (int i = 0; i < 5; i++)

               {

                   Console.WriteLine("请您输入第{0}个数字", i + 1);

                    number[i] = ReadInt(ref i);                               

               }

               for (int i = 0; i < 5; i++)

               {

                   Console.Write("{0}\t",number[i]);

               }

               Console.ReadKey();               

       }

       staticint ReadInt(refint i)  //通过ref,为方法中输入了i

       {

           while (true)

           {

               try

               {

                   int numbers =Convert.ToInt32(Console.ReadLine());

                   return numbers;

               }

               catch

               {

                   Console.WriteLine("您的输入有误,请重新输入第{0}个数字", i + 1);

               }

           }

       }

refout的区别

  ref定义的变量值是互通的,可以在调用方法和被调用方法之间传入和传出值,并且这两个不在同一方法中的变量值任意改变一个都会使得另一变量值改变。而out只是被调用方法中的值单向传出(传回)调用方法中。也就是说如果在调用方法中变量前有ref定义,对其赋值后通过被调用方法可以运算,不必赋初值。

9.实心菱形和一些常用方法

 1))实心菱形

      Console.WriteLine("请您输入一个奇数");

           int number =Convert.ToInt32(Console.ReadLine());

           int t = number/2;

           for (int i = t; i >=-t; i--)

           {

               for (int j = 0; j <Math.Abs(i); j++)

               {

                   Console.Write(" ");

               }

               for (int k =0; k< number-2*Math.Abs(i);k++)       

               {

                   Console.Write("*");

               }               

               Console.WriteLine();               

           }         

           Console.ReadKey();   

输出:

 

 2))一些方法函数

 1     Console.ForegroundColor =ConsoleColor.颜色;  设置控制台输出文字颜色

        Console.ResetColor();              将控制台背景色设置为默认

   2    Console.ReadKey(true);        选择显示按任意键的输出(true不显示, false,显示)

  3    Random r =new Random();     //产生非负随机数,r,i为自定义变量

                 int i = r.Next();    // Next()内可以写一个数(max)也可以是两个数字(minmax)             

                 Random r =new Random();

                 Byte[] i =new Byte[10];             //随机产生一组数

                 r.NextBytes(i);

                 Random r =new Random();     

                  double i = r.NextDouble();            //随机产生0-1之间的小数

  

  4    string.Format();    使得字符串变量中可以插入占位符,不同于  Console.WriteLine();的区别是,可定义一个变量接受该字符串,并且在特定条件下显示。

例如:  string msg="";

           Console.WriteLine("请输入一个数字");

           int number=Convert.ToInt32(Console.ReadLine());

           if (number == 1)

           {

               msg =string.Format("你刚才输入的数字是{0}",number);

           }

           if (number == 2)

           {

               msg =string.Format("你刚才输入的数字不是{0}",number+1);

           }

           Console.Clear();

           Console.WriteLine(msg);

           Console.ReadKey();

         清屏之后,如果之前是Console.WriteLine();则此处无法再次显示,而定义变量后,可以临时存储该语句。

5 ConsoleKeyInfo input=Console.ReadKey(true);           //获取用户输入的键  

           input.Key ==ConsoleKey.H        // H可以是任意键,设置用户输入指定键

6Console.Clear();    清屏

7Environment.Exit(0);              立即结束程序

---------------------- ASP.Net+Android+IOS开发 .Net培训 、期待与您交流! ----------------------
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值